【问题标题】:Is it better use getter methods or to access private fields directly when overriding toString? [duplicate]重写 toString 时使用 getter 方法还是直接访问私有字段更好? [复制]
【发布时间】:2010-01-15 16:35:45
【问题描述】:

我见过两种方法都使用过,但从未听说出于任何特定原因,一种方法优于另一种方法。

public String toString() {
  return this.field1 + " " + this.field2;
}

public String toString() {
  return getField1() + " " + getField2();
}

我在示例中使用了字符串连接来保持代码简洁。

【问题讨论】:

  • 这是相当主观的,也许是社区维基?
  • 如果有功能上的理由偏爱一个而不是另一个,那么这不是主观的。
  • 是的,有一个更喜欢 getter 的功能性原因。如果您使用带有延迟初始化的 ORM,则直接使用字段将不起作用。之前被这个bug咬过,+always+在实体中使用getter。

标签: java tostring


【解决方案1】:

使用吸气剂,如果你有的话!

也许,有一天您更改了代码,以便 getter 不仅会返回字段值,还会做更多事情或以不同的方式创建结果。然后你会更高兴你一直使用吸气剂。

但是像往常一样,我的建议有一些例外 - 如果您允许覆盖 getter 方法,您对 toString() 方法有什么期望,您希望它使用类字段还是 - 也许覆盖 - getter 方法。

所以,像往常一样,这取决于,但我会使用 getter,除非我有充分的理由直接访问这些字段。

【讨论】:

  • 你已经把两个视图都放了。但问题仍然是我们应该使用哪一个:)
【解决方案2】:

如果访问器方法在返回字段值的基础上提供任何额外的逻辑(如大写字符串或类似的东西),则可能首选使用访问器方法。如果您的类被设计为可扩展的,我会倾向于访问器,因为它们可能会被覆盖。

【讨论】:

  • 我通常制作我的 POJO/TOs final。我也很少在 getter 中看到任何额外的逻辑。
  • 真的吗?我见过 getter 生成的值甚至不是相关对象的显式属性。
  • 另外,如果你的对象是final,那么它显然不属于“设计为可扩展”。
【解决方案3】:

在 toString 中使用 getter 是多余的。并且您不应该将 toString 用于非调试目的。

【讨论】:

  • 回复:“那么你不应该将 toString 用于非调试目的。” - 什么?
  • 在很多情况下使用 toString() 在调试目的之外是有效的。例如,如果您有一个 XML 类,那么期望 .toString() 返回 XML 中的字符串表示是完全合理的。与 URL 或 URL 类相同,toString() 将是一个合理的非惊人方法,期望提供对象的字符串表示。
  • 或者,每隔一个班级。 toString()Object 类的成员是有原因的。
  • 为什么投反对票? @danben 和 @fuzzy:阅读 Object.toString() 的 Javadoc。它不能保证任何事情。您不必覆盖它。因此,如果您的 toString() 调用任何其他的 toString,您永远不知道会得到什么。 3rd 方 API 可以随心所欲地改变这些东西。如果我正在生成一个 XML 字符串,我的方法将被称为 toXmlString。如果您要将对象表示为最终用户的字符串,则需要考虑各种因素:语言、安全/权限、显示首选项等。您将所有逻辑都放在 toString 中?
  • 为什么在 toString() 中使用 getter 过大?大多数现代编译器都足够聪明,可以内联此类调用以进行优化
【解决方案4】:

我更喜欢直接访问私有变量的方法。恕我直言,gettter 方法会增加混乱。

【讨论】:

    【解决方案5】:

    你有任何理由使用 getter 方法吗?他们做了什么有趣的事吗?

    ...或者您只是使用它们来公开内部数据而没有真正公开这些字段本身(穷人的封装)?

    如果是前者,那么当然也可以在这里使用它们!如果是后者,那么没关系 - 你可能还是想使用它们,以防你曾经给它们一个真正的目的,但它不会有任何区别。

    【讨论】:

      【解决方案6】:

      使用String.format("%s %s", this.getField1(), this.getField2()); 是最好的方法,因为.getXXX() 方法中可能包含您想要的逻辑,例如将NULL 引用转换为空字符串或一些您无法通过盲目访问获得的默认值私有实例。这是最安全的方法,以防万一有人出现并向 .getXXX() 方法添加逻辑并且他们不认为更新 .toString() 实现。

      【讨论】:

        【解决方案7】:

        如果您的类具有用于字段的 getter 和 setter,那么无论您是使用 getter 和 setter 还是直接访问字段,您都应该在该类的整个实现过程中保持一致。混合抽象级别通常没有意义。否则,您如何合理地在某些地方使用它们而在其他地方不使用它们?此外,如果 getter 的实现方式发生变化,您最终可能会得到微妙的包。 toString() 是实现的一部分,所以它也应该是一致的。

        就性能而言,这无关紧要 - 你的微不足道的 getter 和 setter 无论如何都应该是 final 方法,所以无论如何它们都应该被内联。如果它们不是最终的,你应该问自己为什么,并且可能避免直接访问这些字段,除非这真的是你的意思。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-12-05
          • 2018-09-05
          • 2011-09-27
          • 1970-01-01
          相关资源
          最近更新 更多