麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 學院 > 開發設計 > 正文

使toString()的創建自動化

2019-11-18 13:18:50
字體:
來源:轉載
供稿:網友

  有經驗的 java 開發人員都知道寫好 toString 方法很重要。對可用人類理解的形式查看的對象進行記錄和調試都相當輕易;當處理分布式應用程序時尤其是這樣。不幸的是,為許多類實現 toString 方法可能相當耗時 -- 尤其是對于那些具有許多屬性的類。因為 toString 的行為相當規則,所以最好使創建該方法的任務能夠自動完成。本文提供的這個實用程序可以幫助您實現這一點,同時也減輕了您在開發時的負擔。
  
  參與大項目的開發人員通常要花數個小時編寫有用的 toString 方法。即便不為每個類都提供屬于它們自己的 toString 方法,但每個數據容器都必須有自己的 toString 方法。讓每個開發人員按他們自己的方法編寫 toString 方法可能會造成混亂;每個開發人員無疑都會提出一種唯一的格式。結果,在調試過程中使用這樣的輸出將增添不必要的麻煩,而且也沒有什么好處。因此,每個項目都應該為 toString 方法規定一種單一的格式,并使它們的創建自動化。
  
  使 toString 的創建自動化
  我下面將演示一個實用程序,您可用它來實現 toString 的自動創建。這個工具會自動為指定的類生成一個規則的、強健的 toString 方法,幾乎消除了用于開發該方法的時間。它還對 toString() 的格式進行集中治理。假如您更改了格式,則必須重新生成 toString 方法;但是,這仍然比手動更改成百上千個類要輕易得多。
  
  對生成的代碼進行維護也很輕易。假如您在類中添加了更多的屬性,則您也可能需要對 toString 方法作一些修改。因為 toString 方法是自動生成的,所以您只須再次對該類運行這個實用程序來完成更改。這比手動方法更簡單,而且犯錯誤的可能性也較小。
  
  代碼
  本文無意解釋 Reflection API;下面的代碼假定您已理解 Reflection 的基本概念。要查看 Reflection API 的文檔,您可以訪問參考資源部分。實用程序的源代碼如下所示:
  
  package fareed.publications.utilities;
  import java.lang.reflect.*;
  
  public class ToStringGenerator
  {
  public static void main(String[] args)
  {
  if (args.length == 0)
  {
  System.out.  System.exit(0);
  }
  
  try {
  
  Class targetClass = Class.forName(args[0]);
  
  if (!targetClass.isPrimitive() && targetClass != String.class)
  {
  Field fields[] = targetClass.getDeclaredFields();
  
  Class cSuper = targetClass.getSuperclass(); // 檢索超類
  
  output("StringBuffer buffer = new StringBuffer(500);"); // 構造緩沖區
  
  if (cSuper != null && cSuper != Object
  
  for (int j = 0; j < fields.length; j++) {
  output("buffer.append(/"" + fields[j].getName() + " = /");"); // 附加域名稱
  
  if (fields[j].getType().isPrimitive() fields[j].getType() == String.class) // 檢查基本數據類型或字符串類型
  output("buffer.append(this." + fields[j].getName() + ");"); // 附加基本數據類型域的值
  else
  {
  /* 它“不是”基本數據類型域,所以需要檢查聚集對象的 NULL 值 */
  output("if ( this." + fields[j].getName() + "!= null )" );
  output("buffer.append(this." + fields[j].getName() + ".toString());");
  output("else buffer.append(/"value is null/"); ");
  } // else 結束
  } // 循環結束
  output("return buffer.toString();");
  }
  } catch (ClassNotFoundException e) {
  System.out.println("Class not found in the class path");
  System.exit(0);
  }
  }
  
  private static void output(String data)
  {
  System.out.println(data);
  }
  
  }
  
  代碼輸出通道
  代碼的格式還取決于您的項目工具需求。某些開發人員可能喜歡將這些代碼存入磁盤上用戶定義的文件中。而另一些開發人員對 system.out 控制臺就很滿足,他們可以利用控制臺手動將這些代碼復制或嵌入實際的文件中。我將這些選擇權留給您,本文只使用最簡單的方法:system.out 語句。
  
  這種方法的局限性
  這種方法有兩個明顯的局限性。第一個局限性是它不支持對象的循環包含。假如對象 A 包含對象 B 的一個引用,對象 B 又包含對象 A 的一個引用,則這個工具無法處理。但是,對于許多項目而言,這種情況很少出現。
  
  第二個局限性是添加或減少成員變量之后要求重新生成 toString 方法。因為不管用不用這個工具都需要完成這一步,所以這不是工具特有的問題。
  
  小結
  在本文中,我說明了一個小型的自動實用程序,它可以真正提高開發人員的效率,就整個項目的工期而言,它起著很小但很重要的作用。
  
  補充技巧
  這篇技巧發表以后,我收到讀者關于改進這段代碼的幾點建議。在這部分補充內容中,我將說明如何根據這些建議以及我自己的見解改進這個實用程序。在參考資源部分可找到這些改進的源代碼。
  
  改進 在最初的代碼中,我沒有處理包含對象和基本數據的數組類型;現在新代碼可以處理數組數據。但是,這段代碼只能處理一維數組,而不能處理多維數組。我現在還無法提供這個問題的一般解決方案,因為就我所知,Java 對數據類型的維數沒有限制(只受可用內存的限制)。我歡迎您提供解決方案。
  
  改進 最初我建議將這個工具用于開發時環境,而不是運行時環境。答應這個工具在運行時運行很方便,但可能會占用更多的 CPU 周期。但是,對象轉儲/調試(toString() 的基本用途)通常是在開發時進行,而在生產環境中要將其關閉。在某些情況下,假如某些項目可能將 toString() 用于業務邏輯,則在生產環境中就可能不能關閉轉儲/調試。我建議您根據具體項目決定是否將其關閉。
  
  在開發這個實用程序之前,我已經想到了這種運行時靈活性。首先,我開發了一個單獨的授權類,客戶端的類用它來生成 toString()。這個類利用類似 return ToStringGenerator.generateToString(this) 的一個方法調用生成 toString,其中 this 指向客戶端類的當前實例,這條語句放在 toString() 方法實現中。但這個方法失敗了,因為 Reflection API 在運行時無法獲取私有成員的值。因此這個類只能用于公用成員,這不是我所希望的。
  
  但后來 Sanscraint 先生指出,假如將這段代碼放在同一個調用類的一個方法中,則同樣的 Reflection API 代碼就可以獲取私有成員的值。因此,我修改了這個實用程序以便在運行時使用,另外,即使在目標類中新增或減少了任何屬性,您也不必更新或編輯 toString() 方法。
  
  改進 最初我用 this 前綴來訪問生成代碼中的成員變量,但 Ye 先生指出,這段代碼也可用于靜態方法,甚至可用來輸出靜態成員。這樣,更新后的代碼現在既可處理類成員,也可處理實例成員。Ye 先生還指出一個錯誤(在此版本中已修正),這個錯誤導致為無屬性的類生成毫無用處的代碼。
  
  代碼修改
  在使這個實用程序可用于運行時以后,我不得不在每個類中復制/粘貼這些方法,因為新代碼由多個方法組成,所以這變得很困難,我對此感到很沮喪。
  
  一種解決方案是創建一個接口/抽象基類,這至少解決了方法簽名問題,但仍然需要進行復制/粘貼。抽象基類還使客戶類無法從另一個類繼續出。
  
  但是,內部類可以訪問父類的私有成員,這樣在內部類的方法中運行的 Reflection 代碼也可以獲取私有值。因此我決定將這個實用程序改為內部類,它可被插入客戶的任何父類中。我還提供了 ToStringGeneratorExample.java,它將 ToStringGenerator.java 用作內部類來實現 toString() 方法。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 国产精品一区二区三区99 | 青草av.久久免费一区 | 91精品国产日韩91久久久久久360 | 免费一级a毛片在线播放视 日日草夜夜操 | 国产精品久久久免费观看 | 污污短视频 | 成人免费福利网站 | 黄色美女网站免费看 | 亚洲日本韩国在线观看 | 久久人人av| 国产中出在线观看 | av久草| 久久综合一区 | 久草干 | 成人在线视频一区 | 老子午夜影院 | 精品成人网 | 亚洲一级网站 | 亚洲一区二区三区在线看 | 最近日本电影hd免费观看 | 久久综合给合久久狠狠狠97色69 | 美女黄页网站免费进入 | 久久久日韩精品一区二区三区 | 久久久婷婷一区二区三区不卡 | 91麻豆精品国产91久久久无需广告 | 成人毛片100免费观看 | 99热草 | 一级片久久免费 | 美女一级毛片 | 国产免费小视频在线观看 | 国产乱淫av| 毛片免费一区二区三区 | 91精品国产91久久久久久吃药 | 5xsq在线视频 | 欧美大电影免费观看 | 亚洲欧美日韩中文在线 | 亚洲精品一区国产精品丝瓜 | 香蕉黄色网 | 国产91一区二区三区 | 中文字幕在线观看日韩 | 巨根插入 |