是否更好地使用getter方法或在覆盖toString时直接访问私有字段?

时间:2010-01-15 16:35:45

标签: java tostring

我已经看过这两种方法,但从来没有听说过任何一种方式比其他方式更受欢迎。

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

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

我在我的例子中使用String连接来保持代码简洁。

7 个答案:

答案 0 :(得分:9)

如果你有吸气剂,请使用吸气剂!

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

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

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

答案 1 :(得分:3)

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

答案 2 :(得分:2)

在toString中使用getter是一种过度杀伤力。并且您不应该将toString用于非调试目的。

答案 3 :(得分:2)

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

答案 4 :(得分:1)

你有理由使用getter方法吗?他们做有趣的事吗?

...或者你只是使用它们来暴露内部数据而不实际将这些字段公开(穷人的封装)?

如果是前者,那么也可以在这里使用它们!如果是后者,那么无关紧要 - 无论如何你可能想要使用它们,以防万一你曾经给它们一个真正的目的,但是否则它不会有一点区别。< / p>

答案 5 :(得分:0)

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

答案 6 :(得分:0)

如果您的类具有字段的getter和setter,那么在您使用getter和setter或直接访问字段时,您应该在该类的实现中保持一致。混合抽象级别通常没有意义。否则,你如何在某些地方合理使用它们而不是在其他地方使用它们?此外,如果吸气剂的实施方式发生变化,最终可能会出现细微的袋子。 toString()是实现的一部分,所以它也应该是一致的。

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