J2EE社區

          茍有恒,何必三更起五更眠;
          最無益,只怕一日曝十日寒.
          posts - 241, comments - 318, trackbacks - 0, articles - 16

          commons lang組件之自定義toString()內容

          Posted on 2010-08-18 16:21 xcp 閱讀(803) 評論(0)  編輯  收藏

          問題

            在維持能控制其輸出,內容和格式時才需要自定義toString()


              jakarta commons  commons-lang-2.4.jar提供功能
              

              1、ReflectionToStringBuilder.reflectionToString(this);   或者其它的ReflectionToStringBuilder.toString(..).;
                    
               2、在提供ReflectionToStringBuilder的同時,Commons Lang也通過ToStringBuilder和ToStringStyle類提供了定制功能.  可以通過傳給ToStringBuilder類一個ToStringStyle對象來定制.下面的示例實現了一個即定制了樣式又定制了內容的 toString()方法:
            
            import org.apache.commons.lang.builder.ToStringBuilder;
            import org.apache.commons.lang.builder.ToStringStyle;
            
            public String toString(){
              return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE).
                append("lastName",lastName).
                append("firstName",firstName).
                toString();
            }
            
            上述toString()方法只輸出由append()參數指定的那兩個屬性.如下所示:
            
            com.dscursive.jccook.lang.builders.PoliticalCandidate@1cd2e5f[
              lastName=Jefferson
              firstName=Thomas
            ]
            使用反射生成toString()的內容有利于節省時間,但這樣做只能全部輸出該類的成員變量.如果想輸出指定的幾個變量怎么辦?
            如果類里面的一些內容不便輸出呢?此外,一個對象可能有很多屬性,或者某個屬性含有大量的文本內容.在這種情況下,使用
            ReflectionToStringBuilder輸出類中每個變量是不可行的.
            
            使用ToStringBuilder時,可借助ToStringStyle類的靜態成員來定制輸出內容.ToStringBuilder的構造函數接受一個對象實例
            和一個ToStringStyle樣式作為參數,返回一個ToStringBuilder類實例.該生成器接著通過append()被定制,append()方法指定
            哪些屬性會被輸出.定制ToStringBuilder時,你需要手動添加各個屬性到生成器實例中.append()方法可以接受所有基本類型,
            對象和數組.
            如:
            append(int value)                添加整數值
            append(String n,int value)           添加整數值和屬性名
            append(Object value)              添加對象的toString()方法
            append(String n,Object value)          添加對象的toString()方法和屬性名
            append(int[] array)               添加格式化后的數組內容
            append(Object[] array)             
            append(String n,int[] array)          添加屬性名和數組大小
            append(String n,Object[] array) 
            append(String n,int[] array,boolean detail)   添加屬性名和數組全部內容.
            
            ToStringStyle類提供了對ToStringBuilder類輸出進行定制的機制,同時也提供幾種內建樣式.ToStringStyle.
            MULTI_LINE_STYLE是這些樣式之一,其作用是在每兩個屬性之間插入換行符.另一個例子是ToStringStyle.
            SIMPLE_STYLE,它的作用是簡單地輸出每個變量的值.下面每個內置樣式都提供了一個示例:
            
            ToStringStyle.DEFAULT_STYLE
            com.discursive.jccook.lang.builders.PoliticalCandidate@1cd2e5f[lastname=Jefferson,firstname=Thomas]
            
            ToStringStyle.MULTI_LINE_STYLE
            com.discursive.jccook.lang.builders.PoliticalCandidate@1cd25f[
              lastName=Jefferson
              firstName=Thomas
            ]
            
            ToStringStyle.NO_FIELD_NAMES_STYLE
            com.discursive.jccook.lang.builders.PoliticalCandidate@icd2e5f[Jefferson,Thomas]

           

           

            ToStringStyle.SIMPLE_STYLE
            Jefferson,Thomas
            
            
            對toString()方法而言最重要的是什么?一是準確,二是要緊緊跟上不斷變化的系統內容.任何實用的錯誤信息里都帶有顯示出錯
            對象內容的文本信息.出現異常時,只要打印出對象的值,往往就能很容易知道是什么地方引起異常.在缺日志系統的情況下,離開調試
            器就幾乎無法調試程序,尤其是在診斷一個只影響很少人的罕見問題,而這個問題只有在特定場景下執行特定的操作才會碰到.這時,
            最好能知道和錯誤相關的每個對象的內部狀態,而toString()方法是顯示這些信息的最簡便辦法.自動生成toString()方法會使你的
            錯誤提示信息更有意義.

          測試代碼 復制代碼
          1. package test2;   
          2.   
          3. import org.apache.commons.lang.builder.ToStringBuilder;   
          4. import org.apache.commons.lang.builder.ToStringStyle;   
          5.   
          6. /**   
          7.  * 用Commons Lang組件實現自定義toString()方法   
          8.  * @author fhd001   
          9.  */   
          10. public class ToStringTest2 {   
          11.   
          12.     public static void main(String[] args) {   
          13.   
          14.         Student1 stu1 = new Student1();   
          15.         stu1.setAddress("湖北");   
          16.         stu1.setName("李小龍");   
          17.         stu1.setAge(60);   
          18.            
          19.         System.out.println(stu1.toString());   
          20.     }   
          21. }   
          22.   
          23. class Student1{   
          24.        
          25.     private String name;   
          26.     private int age;   
          27.     private String address;   
          28.        
          29.     public void setName(String name) {   
          30.         this.name = name;   
          31.     }   
          32.     public void setAge(int age) {   
          33.         this.age = age;   
          34.     }   
          35.     public void setAddress(String address) {   
          36.         this.address = address;   
          37.     }   
          38.     public String getName() {   
          39.         return name;   
          40.     }   
          41.     public int getAge() {   
          42.         return age;   
          43.     }   
          44.     public String getAddress() {   
          45.         return address;   
          46.     }   
          47.        
          48.     @Override   
          49.     public String toString() {   
          50.   
          51.         /*   
          52.          * 這里用ToStringBuilder,ToStringStyle類重寫toString()方法   
          53.          */   
          54.         return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)   
          55.                 .append("name",name).append("address",address).toString();   
          56.     }   
          57. }  

            

          結果代碼

        1. test2.Student1@a62fc3[   
        2.   name=李小龍   
        3.   address=湖北   
        4. ]  


        5. 轉載于http://www.aygfsteel.com/xcp/admin/EditPosts.aspx?opt=1


          名稱: ?4C.ESL | .↗Evon
          口號: 遇到新問題?先要尋找一個方案乄而不是創造一個方案こ
          mail: 聯系我


          主站蜘蛛池模板: 汝州市| 巫山县| 县级市| 醴陵市| 丹凤县| 绥江县| 新民市| 湖南省| 东乌珠穆沁旗| 双辽市| 青州市| 辉南县| 齐齐哈尔市| 阳泉市| 灌南县| 中方县| 沂水县| 祁门县| 手游| 嘉禾县| 霸州市| 福贡县| 辰溪县| 峨边| 青龙| 东乡县| 舟曲县| 弥勒县| 河西区| 阳西县| 宁夏| 吕梁市| 旺苍县| 平凉市| 夏津县| 武陟县| 大新县| 抚顺县| 铁岭县| 杭锦后旗| 太仓市|