什么时候不希望在Java中实现toString()?

All*_*nde 41 java tostring

我项目的首席开发人员已经将项目的toString()实现称为"pure cruft",并希望将它们从代码库中删除.

我已经说过这样做意味着任何希望显示对象的客户都必须编写自己的代码来将对象转换为字符串,但是回答"是的,他们会".

具体来说,这个系统中的对象是矩形,圆形等图形元素,当前表示是显示x,y,比例,边界等...

那么,人群在哪里撒谎?

什么时候你应该什么时候不应该实现toString?

djn*_*jna 68

他们有什么害处?为什么要删除它们?我发现toString()在发出调试语句时非常有用.

就个人而言,我总是错误地认为有一个可行的toString()方法.写作工作很少.

  • 用于调试的toString()非常有用,Eclipse允许您为无法编辑的库中的类提供自己的"toString()"覆盖.该功能称为"详细格式化程序". (23认同)
  • 详细格式化:http://www.javalobby.org/java/forums/t16350.html.Window-> Preferences-> Java-> Debug-> Detail Formatters (2认同)

jsi*_*ght 35

删除写得很好(甚至中途写得不好)的toString()方法是纯粹的疯狂,IMO.是的,我经常懒得写这些(因为这些对象通常不会最终使用它们),但它们非常方便.

我真的想不出想要摆脱这些的好理由.


z *_* - 18

我总是确保我的类实现了toString.

它提供了一种在我调试时调试类的当前状态的简单方法,当我记录错误时,我可以将它包含在我的日志消息中.


jjn*_*guy 15

我会继续toString()实施.它们在调试时非常有用,它们可以为图形组件提供良好的替代文本.


Mik*_* C. 12

我认为相反,toString()应该明智地重写.默认的toString()实现是非常无法提供的,基本上没用.一个好的toString()实现可以为开发人员提供一个非常有用的对象内容视图.你可能不必把所有东西放在那里,但至少是重要的东西.我认为你的首席开发人员应该实际编码和添加功能,而不是担心"残酷".


rao*_*son 11

我只会为更复杂的对象实现它,其中客户端代码不关心对象状态的细粒度细节,而是关心一些更易于理解的感知消息,它​​总结了正在发生的事情,状态明智. .

对于其他一切,比如JavaBeans,如果需要进行低级调试,我希望客户端代码将我的对象抛出到ToStringBuilder方法或类似方法中.

ToStringBuilder.reflectionToString(myObject);
Run Code Online (Sandbox Code Playgroud)

或者客户端代码应该只调用标准属性getter并记录他们喜欢的方式...


Gre*_*tes 7

一般来说,toString()是好东西.特别是,它对调试非常有用.

实施toString()并非没有成本风险.与所有代码一样,toString()必须使用其余代码维护实现.这意味着toString()与类字段保持同步.例如,当一个字段被添加或删除,toString()应适当更新(你应该已经等这样的方法hashCode()equals()).

实施toString()也会带来风险.例如,假设系统中的两个类引用了另一个类的实例(双向链接),那么由于无限递归,调用toString()可能导致堆栈溢出,因为toString()每个类中的toString()实现调用实现其他课程.

如果您的系统有大量不同步的toString()方法,或导致堆栈溢出等错误的方法,那么您的同事可能有一个合理的观点.即使在这种情况下,我也会简单地评论出错误的toString()方法并将它们留在代码中.每种toString()方法都可以取消注释,并在将来根据需要单独更新.


Mat*_* B. 6

我总是为我的所有s,s和/或任何持有持久数据的对象自动生成 toString()方法.对于私人内部物业,良好的伐木实践应该可以解决问题POJODTO

永远记得用toString方法替换密码和其他sesitive信息[Omitted](或类似顶级secrete性质)