【问题标题】:Is it ok to add toString() to ease debugging?可以添加 toString() 以简化调试吗?
【发布时间】:2017-10-23 07:04:50
【问题描述】:

我在 intellij 工作了很多,让类拥有自己的 tostring 会非常方便(intellij 中生成的 tostring 可以正常工作),因此当你试图弄清楚什么是什么时,你可以看到比 MyClass@1345 更有用的信息.

我的问题是:可以吗?我正在添加没有商业价值且不影响我的测试用例或我的软件执行的代码(我不使用 toString() 进行调试以外的任何事情)。尽管如此,它仍然是我过程的一部分。什么是正确的?

【问题讨论】:

  • 调试时使用,提交前删除?
  • 我更喜欢在每个类中重写该方法,即使我从不使用它
  • 这是一个意见问题,因此它可能会被关闭,因为这个网站是针对有明确答案的问题。就个人而言,我认为向所有类添加 toString 方法没有问题。事实上,我认为这样做是个好习惯。
  • 使用实际的调试器代替打印
  • 只用于调试的代码有什么问题?通过类似的推理,应该禁止单元测试,因为它们不会增加“商业价值”。你看重的是代码更容易调试,因此错误更少。

标签: java tostring


【解决方案1】:

除了davidxxx的优点外,还有以下几点:

  • 一致性很重要。使用您的代码的人不应该对您的类中发生的事情感到惊讶。因此,要么“所有/大多数”类 @override toString() 使用类似的实现,要么“没有”这样做。
  • 因此:确保每个人都同意是否/如何实施toString()
  • 特别确保您的toString() 实现稳健

含义:您绝对必须避免您的实现引发任何异常(例如 NPE,因为您碰巧为某些可能为 null 的 fieldX 执行了someString + fieldX.name())。

您还必须避免创建“昂贵”的实现(例如,对某些数据库进行“深入研究”以从那里返回值的代码)。

2分个人意见:我觉得toString()在调试东西时很有价值;但我也看到了 toString() 过于昂贵 对性能的实际影响。问题是:您不知道某些跟踪代码在您的对象上调用toString() 的频率;所以你最好确保它快速返回

【讨论】:

  • 鲁棒性确实是很重要的一点。使用 JPA,它甚至可能造成灾难。不错的补充。
【解决方案2】:

docs解释这个方法的作用:

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

如您所见,他们没有指定此方法的特定用途或不鼓励您将其用于调试,但他们仅说明预期执行的操作,并建议在 Object 的子类中实现此方法。

因此,严格来说,如何使用此方法取决于您自己。在我正在学习的大学课程中,某些任务需要覆盖 toString 方法,在某些情况下,我们被要求使用它来演示调试。

【讨论】:

    【解决方案3】:

    这完全没问题,甚至是个好主意。大多数类没有指定 toString 的内容,因此将其用于逻辑是不明智的(内容可能会在类的未来版本中发生变化)。但有些类可以,例如 StringBuilder。然后将返回值用于逻辑也是可以的。

    因此,对于您自己的类,您甚至可以选择指定内容并使用(并让您的用户使用)逻辑的返回值。

    【讨论】:

      【解决方案4】:

      toString() 方法主要设计为调试目的的方法。
      除了一些特殊情况,您应该倾向于将其用于调试目的,而不是向客户端显示信息,因为客户端的需求可能恰好与今天的 toString() 方法不同或相同,但明天可能会有所不同。

      toString() javadoc,您可以阅读:

      返回对象的字符串表示形式。一般来说, toString 方法返回一个“以文本形式表示”的字符串 目的。结果应该是简洁但信息丰富的表示 这对一个人来说很容易阅读。建议所有 子类覆盖此方法。

      对你来说重要的部分是:

      结果应该是简洁但信息丰富的表示 这对人们来说很容易阅读。

      建议所有 子类覆盖此方法。

      你说过:

      不过,这仍然是我过程的一部分。什么是正确的?

      好东西:规范推荐它。

      【讨论】:

      • 不错的一个。再次感谢您留下一些东西,这样我也可以写下我的 2 美分;-)
      • @GhostCat 我也不愿讨论健壮性和性能问题。终于不是一件坏事,因为你让我摆脱了它;-)
      • 我无法得到更好的答复。谢谢。
      • 不客气。最后你做了你必须做的事情。总是好消息:)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-12-23
      • 2012-03-26
      • 2015-07-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-24
      相关资源
      最近更新 更多