问题
在维持能控制其输出,内容和格式时才需要自定义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()方法会使你的
错误提示信息更有意义.
- package test2;
-
- import org.apache.commons.lang.builder.ToStringBuilder;
- import org.apache.commons.lang.builder.ToStringStyle;
-
- /**
- * 用Commons Lang组件实现自定义toString()方法
- * @author fhd001
- */
- public class ToStringTest2 {
-
- public static void main(String[] args) {
-
- Student1 stu1 = new Student1();
- stu1.setAddress("湖北");
- stu1.setName("李小龙");
- stu1.setAge(60);
-
- System.out.println(stu1.toString());
- }
- }
-
- class Student1{
-
- private String name;
- private int age;
- private String address;
-
- public void setName(String name) {
- this.name = name;
- }
- public void setAge(int age) {
- this.age = age;
- }
- public void setAddress(String address) {
- this.address = address;
- }
- public String getName() {
- return name;
- }
- public int getAge() {
- return age;
- }
- public String getAddress() {
- return address;
- }
-
- @Override
- public String toString() {
-
- /*
- * 这里用ToStringBuilder,ToStringStyle类重写toString()方法
- */
- return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
- .append("name",name).append("address",address).toString();
- }
- }
package test2;
import org.apache.commons.lang.builder.ToStringBuilder;
import org.apache.commons.lang.builder.ToStringStyle;
/**
* 用Commons Lang组件实现自定义toString()方法
* @author fhd001
*/
public class ToStringTest2 {
public static void main(String[] args) {
Student1 stu1 = new Student1();
stu1.setAddress("湖北");
stu1.setName("李小龙");
stu1.setAge(60);
System.out.println(stu1.toString());
}
}
class Student1{
private String name;
private int age;
private String address;
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
public void setAddress(String address) {
this.address = address;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
public String getAddress() {
return address;
}
@Override
public String toString() {
/*
* 这里用ToStringBuilder,ToStringStyle类重写toString()方法
*/
return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
.append("name",name).append("address",address).toString();
}
}
结果代码
test2.Student1@a62fc3[
name=李小龙
address=湖北
]
转载于http://www.blogjava.net/xcp/admin/EditPosts.aspx?opt=1
名称: ♪4C.ESL | .↗Evon
口号: 遇到新问题♪先要寻找一个方案乄而不是创造一个方案こ
mail: 联系我