什么时候不需要在Java中实现toString()?
我的项目的一位主要开发人员已经将项目的toString()实现称为“纯粹的”,并且希望将其从代码库中移除。
我说过这样做意味着任何希望显示对象的客户端都必须编写自己的代码来将对象转换为string,但是回答是“他们会这样做”。
具体来说,这个系统中的对象是矩形,圆形等graphics元素,当前的表示forms是显示x,y,缩放,边界等。
那么,人群在哪里呢?
什么时候你应该什么时候不应该实现toString?
他们做什么害处? 为什么要删除他们,如果你有他们? 当发现debugging语句时,我发现toString()非常有用。
就个人而言,我总是会犯一个可行的toString()方法。 这么小的工作来写。
删除写得很好(甚至是写得很好)的toString()方法是纯粹的错误,IMO。 是的,我经常懒得写这些东西(因为这些东西往往不会让它们被使用),但是它们非常方便。
我真的想不出想要摆脱这些的好理由。
我一直确保我的类实现了toString。
它提供了一个debugging当前状态的简单方法,当我正在debugging,当我logging错误时,我可以将它包含到我的日志消息中。
我会保持toString()
实现。 它们对于debugging非常重要,它们可以为graphics组件提供良好的替代文本。
我会认为相反,toString()应该被明智地覆盖。 默认的toString()实现是非常无用的,基本上是无用的。 一个好的toString()实现可以让开发人员一目了然地查看对象的内容。 你可能不需要把所有东西放在那里,但至less是重要的东西。 我认为你的主要开发人员应该实际上是编码和增加function,而不是担心“抄袭”。
我只会实现它更复杂的对象,其中客户端代码不关心对象状态细粒度的细节,而是关心一些更人性可理解的,感觉作出消息,总结发生了什么,明智的状态.. 。
对于其他所有的东西,比如JavaBeans,如果需要进行低级别的debugging,我希望客户端代码将我的对象放入ToStringBuilder方法或类似的东西中。
ToStringBuilder.reflectionToString(myObject);
或者客户端代码应该调用标准属性getters并logging他们喜欢的方式。
一般来说, toString()
是好东西。 特别是对debugging非常有用 。
实现toString()
不是没有成本和风险 。 像所有的代码一样, toString()
实现必须和其余的代码一起维护 。 这意味着保持toString()
与类字段同步。 例如,当一个字段被添加或删除时, toString()
应该被适当地更新(你应该对hashCode()
和equals()
)这样的方法来做这件事。
执行toString()
也会带来风险 。 例如,假设系统中有两个类引用了另一个类的实例(一个双向链接),那么对toString()
的调用可能会导致堆栈溢出,因为无限recursion作为每个toString()
实现类调用另一个类的toString()
实现。
如果你的系统有大量的不同步的toString()
方法,或者导致像堆栈溢出这样的错误的方法,那么你的同事可能有一个合理的观点。 即使在这种情况下,我也只是简单地注释一下bug的toString()
方法 ,并将它们留在代码中。 每个toString()
方法可以在未来根据需要取消注释和更新。
我总是为我所有的POJO
, DTO
和/或任何持有持久数据的对象自动生成 toString()方法。 对于私人内部财产,良好的logging实践应该做的伎俩。
一定要记住用[Omitted]
(或类似的顶级分泌性质) 代替toString方法的密码和其他的sesitive信息,
那么,他做的东西。
我不能说toString()太有用了。 对于演示文稿,您将需要其他工具。
但toString()对于debugging非常有用,因为你可以看到集合的内容。
我不明白为什么删除它,如果它已经写入
我认为答案取决于你的toString()方法有多复杂,他们需要维护多less工作,以及他们多久使用它们。 假设您经常使用toString()来进行日志logging和debugging,那么删除这些方法并没有什么意义。 但是,如果它们很less被使用,并且需要大量的工作来维护每次在代码中的某些变化,那么可能有一个有效的参数来摆脱全部或部分toString()方法。
你提到了一些需要显示这些对象的客户端。 从这我猜你的代码是或包含某种types的库或API,其他开发人员将使用。 在这种情况下,我强烈build议你维护有用的toString()实现。 即使你不做大量的日志logging和debugging,你的客户可能也会明白,有用的toString()方法不需要自己编写和维护。
+1迈克C
toString()在debugging的有效性之上,是了解类作者对实例的视angular的宝贵工具。
FWIW,如果toString的输出不同于你期望看到的(礼貌规范docs),你会知道一些事情严重错误。
就我个人而言,当我打算在JList,JTable或其他使用toString()的结构中使用对象时,我会在执行它们的时候debugging(是的,eclipse有debugging格式化器,但是toString()更容易)。
也许你可以反击,许多JDK类都有toString()。 他们是否也应该被删除? ;)
如果这是一个预期的用例或需求,我会说你应该实现toString,将对象显示为string表示(在日志中,在控制台或某种显示树上)。
否则,我同意开发人员 – 每次你改变一些东西,toString就会中断。 你可能要小心零位等。
然而,很多时候,它实际上是用于debugging或者logging的,所以根本不应该被忽略。
我同意jsight的观点,如果他们已经写得很好,并且写得体面,至less要等到他们阻碍之前(比如你真的为课堂添加一个领域)。
为了debugging目的,没有人可以击败toString
。 这在debugging器和简单的debugging打印中都很实用。 确保它显示了equals
和hashCode
方法所基于的所有字段,如果您也覆盖这些字段!
为了向最终用户显示,我不会使用toString
。 为此,我认为最好是写另一种方法,做适当的格式化,如果你需要的话。
这是很有道理的,因为你总是遇到显示太less或太多信息的问题。
在您的团队中使用Jakarta Commons Lang中的ToStringBuilder可能是有意义的:
System.out.println("An object: " + ToStringBuilder.reflectionToString(anObject));
反思对象,并打印出公共领域。
http://commons.apache.org/lang/api-2.3/org/apache/commons/lang/builder/ToStringBuilder.html
我说过这样做意味着任何希望显示对象的客户端都必须编写自己的代码来将对象转换为string,但是回答是“他们会这样做”。
这不是一个可以孤立回答的问题……你应该问客户(或写信给他们的人)他们对这个主意的看法。 如果我正在使用一个Java库并依靠其toString()重载进行debugging,那么如果库的开发人员决定清除它们,我会感到非常恼火。
公平地说,这里的开发者,但不是任何意义上的开发者。
原来的问题不一定是关于toString(),而是关于第二个方法paramString:“所有的string连接和空值检查,paramString是一个bug磁铁。
我一定会保持toString()的实现,特别是为了debugging目的。 作为一个主要的C ++开发人员,我希望C ++中的事情和Java中的事情一样简单(操作符重载可能会很痛苦)。
如果现有的toString()
实现存在问题,开发人员应该修复这个问题。 说现在的实现都是“纯粹的”,除非现有的toString()
方法写得不是很好,否则删除它们是非常有害的。
我强烈劝阻开发人员删除任何正在运行的toString()
方法。
始终执行:)如上所述,它对于debugging非常重要。
这对于debugging是有好处的。 但是如果你想把给定的对象作为string显示给最终用户,你不应该使用toString()实现,而是为它提供自定义的方法。
所以关于
我说过这样做意味着任何希望显示对象的客户端都必须编写自己的代码来将对象转换为string,但是回答是“他们会这样做”。
我同意你的团队领导。 如果你想显示对象到任何客户端使用自定义实现。 如果你想用它来进行debugging,使用toString()。
虽然toString()
方法对debugging值类非常有用,但可以认为它们对实体类没有用处 。
我们正在从我们的toString()方法之一中抛出一个ConcurrentModificationException,所以偶尔会有一个缺点。 当然,不让它同步是我们自己的错。