此系列文章为本人对《Effective Java》一书的学习笔记,主要是记录对书中重点内容的理解。
既然有缘看到此文,那么希望能对你有所帮助。
本文对应原书第12条 始终要覆盖toString
原因
虽然Object提供了toString方法的一个实现,但它返回的字符串的内容实在是鸡肋,只能看到类名和hashCode的十六进制数字:
正是因为Object
实现的toString
方法过于简单粗暴,所以在toString
的约定指出:
建议所有的子类都重写这个方法
建议
子类在重写时,应该返回对象中的关键信息,以便于更好的完成日志输出及调试工作。
比如以下的电话号码类:
public class PhoneNum {
/*区号*/
private String areaCode;
/*号码*/
private String num;
/*分机号*/
private String extensioNum;
...
}
在调试时
System.out.println("Failed to call " + phoneNum);
肯定不希望出现这样毫无意义的输出:
Failed to call PhoneNum@165b80
所以在重写时需要将关键的信息提取出来:
@Override
public String toString() {
return areaCode + "-" + num + "-" +extensioNum;
}
这样调试时即可输出:
Failed to call 021-1234567-8899
关于返回值格式的探讨
以上的例子我们在toString方法里其实规定了一个格式,即用"-"
将各个部分相连,这样做,对于值类
的表示有个好处,就是它阅读起来非常的标准、明确且舒适,绝大部分的基本类型的包装类,还有BigInteger、BigDecimal都是这样的方式。
其实我们也应该模仿这些Java自带的类去做从String转类的静态工厂或者构造器,如:
public static PhoneNum valueOf(String s) {
PhoneNum res;
if (s != null) {
// 按照"-" 切分字符串
// 检查切分后的格式
// new出PhoneNum,直接用构造器或者一个个set
}
return res;
}
这样可以使得这个类变得完整和便捷,也更加严谨。
总结
在写需要进行实例化的类的时候,要去重写toString
(不管是用IDE生成还是lombok),保证它的返回格式简洁、有用,这样会使得类用起来更加顺手,也更容易调试。
水平有限,若文章中存在错误,恳请不吝赐教,这对我以及后面的读者都有重要意义