J2EE社区

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

commons lang组件之自定义toString()内容

Posted on 2010-08-18 16:21 xcp 阅读(794) 评论(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. }  

  

结果代码

  • test2.Student1@a62fc3[   
  •   name=李小龙   
  •   address=湖北   
  • ]  


  • 转载于http://www.blogjava.net/xcp/admin/EditPosts.aspx?opt=1


    名称: ♪4C.ESL | .↗Evon
    口号: 遇到新问题♪先要寻找一个方案乄而不是创造一个方案こ
    mail: 联系我