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

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

我项目的一位主要开发人员已将项目的toString()实现称为“纯粹的残障”,并希望将其从代码库中删除。

我已经说过,这样做意味着任何希望显示对象的客户端都必须编写自己的代码才能将对象转换为字符串,但这得到了“是的答案”。

现在具体来说,此系统中的对象是矩形,圆形等图形元素,当前表示形式是显示x,y,比例,边界等。

那么,人群在哪里?

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

24个解决方案

68 votes

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

就个人而言,我总是在拥有可行的toString()方法方面犯错。 这么少的工作要写。

djna answered 2020-08-11T23:35:31Z

35 votes

删除纯写的(甚至是写得体面的)toString()方法纯属疯狂,IMO。 是的,我常常懒于编写这些代码(因为这些对象通常最终都不会使用它们),但是拥有它们非常方便。

我真的想不出摆脱这些理由的充分理由。

jsight answered 2020-08-11T23:35:56Z

18 votes

我始终确保我的类实现了toString。

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

z - answered 2020-08-11T23:36:21Z

15 votes

我将保留toString()的实现。 当涉及调试时,它们是无价的,并且它们可以为图形组件提供良好的替代文本。

jjnguy answered 2020-08-11T23:36:41Z

12 votes

我会反过来说,应该明智地重写toString()。 默认的toString()实现非常无用,基本上没有用。 出色的toString()实现可以使开发人员一目了然地获得对象内容的非常有用的视图。 您可能不必把所有东西都放在那里,但至少要把重要的东西放在那里。 我认为您的首席开发人员应该实际上是在编码和添加功能,而不是担心“拼写”。

Mike C. answered 2020-08-11T23:37:02Z

11 votes

我只会在客户端代码不在乎对象状态的细粒度细节的更复杂的对象上实现它,而是在关注一些更人类可理解的,有意义的消息,这些消息总结了状态方面的情况。 。

对于其他所有东西,例如JavaBeans,如果需要执行低级调试,我希望客户端代码将我的对象放入ToStringBuilder方法或类似方法中。

ToStringBuilder.reflectionToString(myObject);

否则客户端代码应该只调用标准属性获取器并以他们喜欢的方式记录...

raoulsson answered 2020-08-11T23:37:31Z

7 votes

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

实施toString()并非没有成本和风险。 与所有代码一样,toString()实现必须与其余代码一起维护。 这意味着使toString()与类字段保持同步。 例如,添加或删除字段时,应适当更新toString()(对于toString()和toString()之类的方法,您应该已经这样做了)。

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

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

Greg Mattes answered 2020-08-11T23:38:06Z

6 votes

我总是为所有300733948388599500500、DTO和/或任何保存持久数据的对象自动生成toString()方法。 对于私有内部属性,良好的日志记录实践应该可以解决问题。

永远记得用3007339483885995005008(或类似的顶级机密性质)替换toString方法中的密码和其他敏感信息。

Mat B. answered 2020-08-11T23:38:31Z

4 votes

好吧,他做了奇怪的事情。

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

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

我不明白为什么要删除它(如果已经写过)

Igor Shubovych answered 2020-08-11T23:39:04Z

4 votes

我认为答案取决于您的toString()方法的复杂程度,它们需要维护的工作量以及使用的频率。 假设您经常使用toString()进行日志和调试,则删除这些方法没有多大意义。 但是,如果很少使用它们,并且每次代码更改时都需要大量工作来维护它们,那么也许有一个有效的参数可以摆脱所有或某些toString()方法。

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

Cosmin Stejerean answered 2020-08-11T23:39:30Z

3 votes

+1麦克C

除了对调试有用之外,toString()是了解类作者对实例的观点的宝贵工具。

FWIW,如果toString的输出与您期望看到的(礼貌规范文档)有所不同,您将立即知道出了严重的问题。

answered 2020-08-11T23:39:59Z

2 votes

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

也许您可以反省许多JDK类具有toString()。 是否也应将其删除? ;)

basszero answered 2020-08-11T23:40:23Z

2 votes

我想说,如果这是一个预期的用例或要求,则应实现toString,以将对象显示为字符串表示形式(在日志中,在控制台上或某种显示树中)。

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

但是,实际上很多时候,它都用于调试或日志记录中,因此,显然根本不应该将它们排除在外。

我同意jsight的观点,即如果它们已经写好并且写得很体面,则至少要等到它们妨碍为止(例如,您实际上将一个字段添加到类中)。

Yishai answered 2020-08-11T23:40:57Z

2 votes

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

为了向最终用户显示,我不会使用toString。 为此,我认为最好编写另一种方法来进行正确的格式化,如果需要,可以使用i18n。

jqno answered 2020-08-11T23:41:22Z

2 votes

这很有道理,因为toStrings总是会显示太多或太多的信息,因此存在问题。

对于您的团队而言,改为在Jakarta Commons Lang中使用ToStringBuilder可能是有意义的:

System.out.println("An object: " + ToStringBuilder.reflectionToString(anObject));

内省对象,并打印出公共字段。

[HTTP://Commons.Apache.org/狼/API-2.3/org/Apache/Commons/狼/builder/ToString builder.HTML]

Thorbjørn Ravn Andersen answered 2020-08-11T23:41:55Z

2 votes

我说过这样做意味着 任何希望展示的客户 这些对象将不得不写他们的 自己的代码将对象转换为 字符串,但是用 “是的,他们会的。”

这不是一个可以孤立回答的问题……您应该问客户(或写信给他们的人)对这个想法的看法。 如果我使用Java库并依靠其toString()重载进行调试,那么如果该库的开发人员决定清除它们,我将非常恼火。

Stephen C answered 2020-08-11T23:42:20Z

2 votes

公平地说,开发人员在这里说,但无论如何都不是首席开发人员。

最初的问题不一定与toString()有关,而与第二个方法paramString有关: “通过其所有的字符串连接和空值检查,paramString是一个吸引人的磁铁。”

请参阅[http://code.google.com/p/piccolo2d/issues/detail?id=99]

answered 2020-08-11T23:42:50Z

2 votes

我绝对会保留toString()实现,尤其是出于调试目的。 作为一个主要的C ++开发人员,我希望在这方面C ++和Java一样简单(操作符重载可能会很痛苦)。

Ryan Zink answered 2020-08-11T23:43:10Z

2 votes

如果现有的toString()实现存在问题,则开发人员应解决此问题。 除非当前的toString()方法的编写不当,否则说当前的实现都是“纯粹的残酷”,并且删除它们正在积极地造成伤害。

我强烈建议开发人员不要删除任何有效的toString()方法。

Eddie answered 2020-08-11T23:43:35Z

1 votes

始终实现:)如上所述,它对于调试非常重要。

Larry Watanabe answered 2020-08-11T23:43:55Z

1 votes

这对于调试目的很有用。 但是,如果要将给定对象显示为最终用户的字符串,则永远不要使用toString()实现,而应为此提供自定义方法。

所以关于

我说过这样做意味着 任何希望展示的客户 这些对象将不得不写他们的 自己的代码将对象转换为 字符串,但是用 “是的,他们会的。”

我同意你的团队领导。 如果要向任何客户端显示对象,请使用自定义实现。 如果要将其用于调试目的,请使用toString()。

jan answered 2020-08-11T23:44:29Z

0 votes

尽管toString()方法对于调试值类非常有用,但可以说它们对实体类没有用。

Raedwald answered 2020-08-11T23:44:49Z

0 votes

考虑到这个问题已经有将近10年的历史了,我认为自己会以更现代的视角来考虑。

toString显然对调试很有帮助-您只需要在这里证明所有其他答案就可以了-调试信息不是业务逻辑。

在每个单个类中都有toString方法是视觉混乱,这会混淆该类的有用行为。 我们还需要记住,每次更改类字段时,都必须手动或通过从IDE重新生成方法来对其进行维护。

那么,如何在不完全删除方法的情况下解决这些问题呢? 答案是自动生成它。 Lombok项目的toString注释可以在编译时自动为您生成toString方法,该方法包括您选择的字段的任意组合。

基本样本用法:

@ToString

public class Foo {

private int i = 0;

}

在编译时将等效于以下内容:

public class Foo {

private int i = 0;

public String toString() {

return "Foo(i=" + this.i + ")";

}

}

Michael answered 2020-08-11T23:45:32Z

-1 votes

我们的toString()方法之一抛出了ConcurrentModificationException,因此偶尔会有一个缺点。 当然,不同步是我们自己的错。

David Plumpton answered 2020-08-11T23:45:52Z

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值