Effective Java -- 始终重写toString

此系列文章为本人对《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),保证它的返回格式简洁、有用,这样会使得类用起来更加顺手,也更容易调试。

水平有限,若文章中存在错误,恳请不吝赐教,这对我以及后面的读者都有重要意义

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值