Effective Java (10) 始终要覆盖toString

时间:2022-04-21 17:51:13

这条其实也好理解,如果没有覆盖toString方法,在调用诸如System.out.println()时,会默认调用Object.toString()方法,输出一个对象引用地址。覆盖toString方法会使这样的输出变得更有意义,是代码日志更可读。

不过如同equals和hashCode方法一样,apache common包里提供了ToStringBuilder来完成相同的工作:

 public class Person {
String name;
int age;
boolean smoker;

...

public String toString() {
return new ToStringBuilder(this).
append("name", name).
append("age", age).
append("smoker", smoker).
toString();
}
}

这个相对而言更方便。或者更偷懒的,可以用BeanUtils.describe()将对象所有的域转变为一个map,然后在将map打出来:

@Override
public String toString(){
try{
return BeanUtils.describe(this).toString();
}
catch(Exception e)
{
return e.toString();
}
}


不过注意,这么做有时会很累赘,且如果对象中动用了反射机制,诸如动态代理之类,往往会发生错误。