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

我已经看到了这两种方法,但是从来没有听说过任何一种方式比任何特定原因都优先于另一种方式。

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

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

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

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

也许,有一天你改变代码,以便getter不仅会返回字段值,而且还会执行更多操作或以不同的方式创建结果。 那么你会更高兴你一直使用getter。

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

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

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

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

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

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

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

如果是前者,那么也可以在这里使用它们! 如果是后者,那么无所谓 – 无论如何你可能想要使用它们, 以防万一你给它们一个真正的目的,但它不会产生一点区别。

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

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

在性能方面,无所谓 – 无论如何,你的琐碎的吸气剂和制定者应该是最终的方法,所以无论如何它们都应该被内联。 如果它们不是最终的,你应该问自己为什么并且可能避免直接访问这些领域,除非这真的是你的意思。