什么时候应该覆盖toString()?

我知道Javadocs说 :

返回对象的字符串表示forms。 通常,toString方法返回一个“文本表示”此对象的字符串。 结果应该是简洁但信息丰富的表示,便于人们阅读。 建议所有子类都覆盖此方法。

但是什么时候应该花时间覆盖我的类的toString方法? 它应该是我与覆盖equalshashCode一起做的第一件事吗? 或者我应该等到实际需要它?

我知道Eclipse可以为你自动生成toString方法,所以一旦我知道了我的类的字段,我应该让Eclipse自动生成它们吗?

Josh Bloch在第 10项的Effective Java中给出了一个很好的解释。

[…]提供良好的toString实现使您的课程更加愉快。

它确实可以更容易地输出调试跟踪,或者生成更好的日志消息,因为您可以直接使用toString()提供的对象的字符串表示forms; 您不必手动构建一个字符串,该字符串提供对象所需的信息。

如书中所述,您应该在结果String包含所有有趣的信息。 您还应该正确记录您的方法; 您可以记录生成的String格式,但至少应该记录您的意图(格式是否可以更改,或者不可能更改)。

最后,由您(以及您公司的标准)来决定是否在每个class级中覆盖它应该是您的习惯的一部分。 就个人而言,我不会在每个类中覆盖toString () ,只会在最有可能被用于debuging跟踪的那些类中。

我会在任何拥有human understandable non confidential data类上实现toString()方法。 例如:传输对象,Bean,数据对象,包装器。 对于这样的类,只需继续实现’toString()’方法。

表示服务的类,具有瞬态的进程无需实现该方法。这里,您可以等到实际需要它。

确保不要在’toString()’中使用“transient”关键字公开任何变量!

通常,当我想指定显示对象的默认格式时,我会覆盖它,通常格式化相关属性的紧凑/可消化显示。 因此,我可以简单地,例如,通过执行以下操作在调试或日志中显示它:

 MyClass myClsInst = new MyClass(); ... System.out.println(myClsInst);