亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

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

使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() 方法。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲欧美福利视频| 成人午夜激情网| 91精品久久久久久综合乱菊| 最新日韩中文字幕| 日韩精品在线第一页| 亚洲成av人乱码色午夜| 久久久久日韩精品久久久男男| 亚洲精品成人久久久| 亚洲国语精品自产拍在线观看| 国产ts一区二区| 亚洲第一区第一页| 精品视频www| 亚洲欧洲国产精品| 欧美成人免费在线观看| 国产精品劲爆视频| 午夜精品一区二区三区在线视频| 中文日韩在线视频| 26uuu日韩精品一区二区| 欧美中文字幕精品| 日韩在线欧美在线| 亚洲一级免费视频| 国产精品一区二区三区在线播放| 久久久久久久久久av| 亚洲韩国青草视频| 久久99久国产精品黄毛片入口| 国产成人久久久精品一区| 91九色精品视频| 91亚洲精品久久久| 成人网页在线免费观看| 亚洲精品电影久久久| 97香蕉久久超级碰碰高清版| 国产精品永久免费在线| 日韩中文视频免费在线观看| 欧美日韩综合视频网址| 欧美日韩国产在线播放| 91久久综合亚洲鲁鲁五月天| 九九热精品视频国产| 欧美韩国理论所午夜片917电影| 国产欧美va欧美va香蕉在线| 亚洲国产一区自拍| 日韩成人中文电影| 亚洲人精品午夜在线观看| 黑丝美女久久久| 亚洲国产天堂久久综合| 欧美一区二区三区……| 91精品视频在线免费观看| 欧美视频一二三| 成人性生交大片免费看小说| 久久国产一区二区三区| 久久精品视频99| 欧美日韩成人精品| 国产精品69精品一区二区三区| 欧美激情aaaa| 国产亚洲视频在线观看| 日韩欧美在线视频免费观看| 日本人成精品视频在线| 911国产网站尤物在线观看| 日韩电影网在线| 欧美天堂在线观看| 黑人极品videos精品欧美裸| 久久久精品欧美| 久久高清视频免费| 欧美国产乱视频| 欧美视频在线免费| 国产精品美女主播在线观看纯欲| 亚洲影院污污.| 日韩视频免费大全中文字幕| 美女久久久久久久| 国产日韩中文字幕| 中文字幕在线看视频国产欧美在线看完整| 久久精品视频播放| 亚洲国内精品在线| 久久久久久国产| 在线视频亚洲欧美| 国产精品美女久久久久av超清| 国产成人极品视频| 精品伊人久久97| 日韩欧美亚洲成人| 亚洲永久在线观看| 日日噜噜噜夜夜爽亚洲精品| 国产欧美久久一区二区| 欧美极品xxxx| 最近的2019中文字幕免费一页| 欧美日韩亚洲一区二区三区| 成人亚洲欧美一区二区三区| 九色成人免费视频| 日韩国产一区三区| 亚洲精品av在线播放| 日韩一区二区av| 亚洲天堂日韩电影| 日韩最新在线视频| 日韩电影中文字幕一区| 久久五月情影视| 91精品国产综合久久香蕉的用户体验| 亚洲天堂男人的天堂| 97香蕉超级碰碰久久免费的优势| 久久久久久久久网站| 久久激情视频久久| 欧美激情国内偷拍| 国产亚洲精品久久久久久牛牛| 日本高清不卡的在线| 欧美成人免费在线视频| 欧美国产日产韩国视频| 上原亚衣av一区二区三区| 日韩电影中文字幕在线观看| 欧美最近摘花xxxx摘花| 国产精品视频区| 九九热精品视频国产| 亚洲激情免费观看| 国产精品久久久久久久av电影| 欧洲亚洲在线视频| 久久这里只有精品视频首页| 国产91露脸中文字幕在线| 色婷婷亚洲mv天堂mv在影片| 精品视频在线导航| 国产精品久久久久久久久久久新郎| 国产精品精品视频一区二区三区| 日韩在线免费观看视频| 欧美在线观看一区二区三区| 日韩美女主播视频| 国内自拍欧美激情| 欧美成人精品影院| 日韩精品视频中文在线观看| 国产91在线播放精品91| 亚洲国产美女久久久久| 欧美视频中文字幕在线| 欧美超级免费视 在线| 插插插亚洲综合网| 欧美激情久久久久| 亚洲成人精品视频在线观看| 精品国偷自产在线视频| 国产日本欧美一区二区三区| 一本一本久久a久久精品综合小说| 国产精品久久久久秋霞鲁丝| 国产精品18久久久久久首页狼| 国内精品视频久久| 成人午夜两性视频| 日韩国产欧美精品在线| 亚洲欧美日韩国产精品| 97福利一区二区| 亚洲欧美国产精品久久久久久久| 亚洲美腿欧美激情另类| 亚洲国产精品成人va在线观看| 美女视频久久黄| 97av在线播放| 在线a欧美视频| 亚洲第一视频在线观看| 国产成人精品久久亚洲高清不卡| 日本精品视频在线| 国产99久久精品一区二区 夜夜躁日日躁| 国产日产久久高清欧美一区| 国产亚洲一级高清| 久久久免费在线观看| 97香蕉久久超级碰碰高清版| 欧美成人午夜激情| 欧美激情一级精品国产| 国产+成+人+亚洲欧洲| 亚洲最大福利网站| 欧美二区乱c黑人| 国产精品成人免费电影| 亚洲男人天堂视频| 色哟哟亚洲精品一区二区| 欧洲日本亚洲国产区| www.日韩免费|