什么时候不需要在Java中实现toString()?

什么时候不需要在Java中实现toString()?,java,tostring,Java,Tostring,我项目的一位首席开发人员将项目的toString()实现称为“纯cruft”,并希望将其从代码库中删除 我说过,这样做意味着任何希望显示对象的客户机都必须编写自己的代码来将对象转换为字符串,但答案是“是的,他们会” 具体来说,该系统中的对象是图形元素,如矩形、圆等,当前的表示方式是显示x、y、比例、边界等 那么,人群在哪里 什么时候应该和什么时候不应该实现toString?它们有什么危害?如果有,为什么要移除它们?我发现toString()在发出调试语句时非常有用 就个人而言,我总是倾向于使用一

我项目的一位首席开发人员将项目的toString()实现称为“纯cruft”,并希望将其从代码库中删除

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

具体来说,该系统中的对象是图形元素,如矩形、圆等,当前的表示方式是显示x、y、比例、边界等

那么,人群在哪里


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

它们有什么危害?如果有,为什么要移除它们?我发现toString()在发出调试语句时非常有用


就个人而言,我总是倾向于使用一个可行的toString()方法。写的工作太少了。

我一直确保我的类实现了toString

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

在我看来,删除写得好(甚至写得不好)的toString()方法纯粹是疯了。是的,我经常懒得写这些方法(通常情况下,这些对象最终不会被使用),但它们非常方便


我真的想不出一个好的理由来摆脱它们。

就我个人而言,我在使用JList、JTable或其他使用toString()的结构中的对象时或在调试时实现它们(是的,eclipse有调试格式化程序,但toString()更容易)


也许您可以回击许多JDK类都有toString()。是否也应该删除它们?;)

我会保留
toString()
实现。当涉及到调试时,它们是非常宝贵的,并且它们可以为图形组件提供良好的alt文本。

如果这是一个预期的用例或需求,那么您应该实现toString,以字符串形式显示对象(在日志中、控制台上或某种显示树上)

否则,我同意开发人员的意见——每次您更改某些内容时,toString都可能会中断。您可能需要注意空值等

但是,很多时候,它实际上是用于调试或日志记录中的,因此不明显它们是否应该被忽略


我同意jsight的观点,如果它们已经编写好了,并且写得很得体,那么至少在它们碍事之前(比如你真的给一个类添加了一个字段)。

好吧,他确实做了一些简单的事情

我不能说toString()太有用了。对于演示,您将需要其他工具

但是toString()对于调试非常有用,因为您可以看到集合的内容


我不明白为什么要删除它,如果它已经被写了

始终实现:)如上所述,它对于调试来说是非常宝贵的。

我只会在更复杂的对象中实现它,其中客户端代码不关心对象状态的细粒度细节,而是关心一些更人性化的理解,有意义的信息,总结了正在发生的事情,从状态上看

ToStringBuilder.reflectionToString(myObject);
对于其他一切,比如JavaBeans,如果需要进行低级调试,我希望客户机代码将我的对象放入一个或类似的程序中

ToStringBuilder.reflectionToString(myObject);

或者客户端代码只需调用标准属性getter并以他们喜欢的方式记录日志…

我认为答案取决于toString()方法有多复杂,需要维护多少工作,以及它们的使用频率。假设您经常使用toString()进行日志记录和调试,那么删除这些方法没有多大意义。但是,如果它们很少使用,并且每次代码发生更改时都需要大量的工作来维护,那么可能有一个有效的理由可以放弃所有或部分toString()方法


您提到了需要显示这些对象的客户端。由此我猜您的代码是或包含其他开发人员将使用的某种库或API。在这种情况下,我强烈建议您维护有用的toString()实现。即使您不做大量的日志记录和调试,您的客户也可能而且他们肯定会喜欢使用有用的toString()方法,而不必自己编写和维护。

为了调试的目的,没有人能打败
toString
。它在调试器和简单的调试打印中都很实用。确保它显示
等于的所有字段
hashCode
方法所基于的字段,如果您也覆盖了这些字段的话


不过,对于向最终用户显示,我不会使用
toString
。为此,我认为最好编写另一个方法,该方法具有正确的格式,如果需要,还可以使用i18n。

我认为应该明智地覆盖toString()。默认的toString()实现非常缺乏信息,基本上没有用处。一个好的toString()实现可以让开发人员一眼就能看到对象内容的非常有用的视图。你可能不需要把所有的东西都放进去,但至少要把重要的东西放进去。我认为您的首席开发人员实际上应该编写代码并添加功能,而不是担心“粗糙”

+1麦克C

除了对调试有用之外,toString()还是理解类作者对实例的看法的一个非常宝贵的工具

FWIW,如果toString的输出与您预期的不同(礼节性规范文档),您将立即知道出现了严重错误。

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

实施
toString()
并非没有成本和风险。与所有代码一样,
toStr
@ToString
public class Foo {
    private int i = 0;
}
public class Foo {
    private int i = 0;

    public String toString() {
        return "Foo(i=" + this.i + ")";
    }
}