7

我已经看到使用这两种方法,但从未听说过出于任何特定原因,一种方法优于另一种方法。

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

相对

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

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

4

7 回答 7

11

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

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

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

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

于 2010-01-15T16:38:36.623 回答
3

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

于 2010-01-15T16:39:02.797 回答
2

在 toString 中使用 getter 太过分了。而且您不应该将 toString 用于非调试目的。

于 2010-01-15T16:38:41.363 回答
2

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

于 2010-01-15T16:39:50.713 回答
1

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

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

如果是前者,那么当然也可以在这里使用它们!如果是后者,那没关系——你可能还是想使用它们,以防万一你给它们一个真正的目的,但否则不会有一点不同。

于 2010-01-15T16:39:35.573 回答
0

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

于 2010-01-15T16:47:55.670 回答
0

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

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

于 2010-01-15T16:52:21.603 回答