Apache Commons Lang为解决动态的toString()方法提供一套强有力的API。
一、实现策略
1、ReflectionToStringBuilder.toString(),通过反射方式实现。
2、new ToStringBuilder(),通过自定义显示格式方式实现,显示的式样提供了好几种。
二、实例
为了测试,创佳两个类 Foo、Bar,分别通过两种方式实现其toString方法
public
class Foo {
private String name;
private int age;
private Bar bar;
public Foo(String name, int age) {
this.name = name;
this.age = age;
}
private String name;
private int age;
private Bar bar;
public Foo(String name, int age) {
this.name = name;
this.age = age;
}
//省略getter/setter方法
}
public
class Bar {
private String name;
public Bar(String name) {
this.name = name;
}
private String name;
public Bar(String name) {
this.name = name;
}
//省略getter/setter方法
}
1、通过反射方式实现toString();
@Override
public String toString() {
return ReflectionToStringBuilder.toString( this);
}
public String toString() {
return ReflectionToStringBuilder.toString( this);
}
显示效果:
lang.Foo@c2a132[name=foo,age=88,bar=lang.Bar@e102dc[name=bar]]
Process finished with exit code 0
Process finished with exit code 0
2、通过自定义格式方式实现
@Override
public String toString() {
return new ToStringBuilder( this, ToStringStyle.MULTI_LINE_STYLE)
.append( "name", name)
.append( "age", age)
.append( "bar", bar)
.toString();
}
public String toString() {
return new ToStringBuilder( this, ToStringStyle.MULTI_LINE_STYLE)
.append( "name", name)
.append( "age", age)
.append( "bar", bar)
.toString();
}
上面这个是仅仅给了Foo类的toString()写法。
ToStringBuilder类有好几个静态常量,用来控制显示格式。
下面给出一个运行结果:
lang.Foo@1aaa14a[
name=foo
age=88
bar=lang.Bar@1e51060[name=bar]
]
Process finished with exit code 0
name=foo
age=88
bar=lang.Bar@1e51060[name=bar]
]
Process finished with exit code 0
从中看来,toString()通过反射方式实现可以真正实现动态的。写法简单也省事,推荐!
本文转自 leizhimin 51CTO博客,原文链接:http://blog.51cto.com/lavasoft/113797,如需转载请自行联系原作者