【问题标题】:toString(): for debugging or for humans?toString():用于调试还是用于人类?
【发布时间】:2011-01-21 18:28:46
【问题描述】:
class Address
{
  private enum Component
  {
    NUMBER,
    STREET,
    STATE,
    COUNTRY
  }

  private Map<Component, String> componentToValue = ...;
}

我希望我的类包含两种方法:

  1. 一个表示每个地址组件的值(这样如果出现问题我可以调试)。
  2. 以人类期望的形式返回地址:“1600 Amphitheatre Parkway Mountain View, CA 94043”。

Object.toString() 的最佳实践是什么?它是主要用于#1还是#2?这些方法的命名是否有最佳实践?

【问题讨论】:

    标签: java naming-conventions


    【解决方案1】:

    您会在 SMS 消息和 HTML 页面中以相同的方式格式化地址吗?英文、法文和日文格式一样吗?

    如果不是,那么您就有了答案:表示不属于对象,而是属于显示对象的表示层。除非该对象是专门为表示层组成的,例如如果它是 HtmlI18nedAddress,则使用 toString 进行调试。

    考虑DateSimpleDateFormatDate 包含状态,SimpleDateFormat 返回多个表示形式。

    【讨论】:

    • 如果您提到 SimpleDateFormat vs Date(或任何其他相关示例),我会将此答案标记为已接受。
    【解决方案2】:

    我会说第一个。数据格式不应硬编码到对象的 ToString() 函数中。

    我是这样看的:我尝试使我的 ToString() 输出数据可由匹配的 Parse(string data) 函数读取(如果该函数实际存在与否并不重要)。所以在这种情况下,如果你想要一个特定的格式,编写一个特定的函数,并将通用数据转储例程留给 ToString()。

    【讨论】:

      【解决方案3】:

      我通常只使用 Apache Commons ToStringBuilder http://commons.apache.org/lang/api-2.5/org/apache/commons/lang/builder/ToStringBuilder.html 与我认为对调试绝对必要的部分。

      【讨论】:

        【解决方案4】:

        根据Effective Java 第 12 条:“始终覆盖 toString”toString() 的合同是:

        结果应该是一个简洁但信息丰富的表示,易于人们阅读。 [...] 提供良好的 toString 实现会使您的类更易于使用,并使系统使用该类更容易调试

        因此,它是用于调试的。

        更多关于toString()的注释:

        • 添加JavaDoc(格式应该在这里解释)
        • 格式一旦确定,请记住该格式将用于解析。

        我强烈建议投资“Effective Java”一书。这是一本非常好的读物。一件物品只需五到十分钟,但您的 Java 生活将永远改变!

        【讨论】:

          【解决方案5】:

          您可以从动态配置的某些调试属性中读取数据。:

          @Override
          public String toString() { 
          
              if(debug) {
                  return debugAddrString()
              }
              return normalAddrString();
          
          }
          

          【讨论】:

          • 我看到我被打败了!
          • 这对我来说没有意义吗?如果在调试时改变它的返回值,那么在生产代码中 toString() 的用法应该是什么?
          • 看起来像是在模拟 C define
          • 所以你从来没有使用详细标志打开登录??
          • 对我来说这很有意义。不幸的是,只有一个 toString,所以它的使用受到限制。任何重要的代码都不应该依赖它,因此您可以根据需要对其进行调整。它适用于这个解决方案,灵活性在调试时可能很有用。
          【解决方案6】:

          ToString 通常只用于调试信息。请记住,您正在覆盖 Object 上的方法;对Object 引用进行方法调用返回人类可读地址在概念上是否准确?在某些情况下,根据项目的不同,这实际上可能是有道理的,但对我来说听起来有点奇怪。我会实现一个新方法。

          另外需要注意的是,大多数现代 IDE 在检查对象时使用 ToString 方法打印有关对象的调试信息。

          【讨论】:

          • IBTD。 StringBuilder 对您的第一句话有什么看法?它的.toString() 真的只用于调试吗?
          【解决方案7】:

          您可以做的一件事是使用 Debug 标志随意更改:

          public String toString(boolean debug) {
              if (debug) return debugStringVersion;
              else return humanVersion;
          }
          
          public String toString() {
              return toString(Util.DEBUG);
          }
          

          当然,这假设您有一个实用程序类,其中包含一个调试标志。

          【讨论】:

          • 这对我来说没有意义吗?如果在调试时改变它的返回值,那么在生产代码中 toString() 的用法应该是什么?
          • @lweller。你不能总是这样做。但有时它会很有帮助。
          猜你喜欢
          • 1970-01-01
          • 2010-10-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多