【发布时间】:2017-04-27 21:47:51
【问题描述】:
例子:
private int x = 4;
public TestClass(int x) {
this.x = x;
}
public TestClass(int x) {
setX(x);
}
public void setX(int x) {
this.x = x;
}
第一个构造函数更好还是第二个更好?我问这个是因为当我将我的类封装在IntelliJ IDEA 中时,如果我之前使用过this.x = x,它会将其更改为setX(int newX);。
【问题讨论】:
-
我通常更喜欢直接赋值,因为它节省了额外的堆栈操作。我通常只在具有比赋值更复杂的行为时才使用方法。
-
可以说调用
setX(int)更不可预测,因为它可以被任何子类覆盖。setX(int)应该是final以防止这种情况;除非打算允许更改。 -
我认为为每个字段制作 getter 和 setter 并简单地在包含类中访问它是一种矫枉过正的做法。所以我个人会坚持第一个例子
this.x = x;。但当然可以说这取决于具体情况。 -
@OusmaneMahyDiaw 如果它需要读写,那么我不同意。
-
强烈建议不要在 setter 中使用额外的逻辑,setter 应该只使用给定参数设置字段值 - 如果您需要额外的逻辑,请使用描述性名称调用方法。关于调用方法而不是直接访问该字段对额外的堆栈操作/轻微性能造成的影响 - 我认为实际上不会有任何影响,因为 JVM / JIT 优化,方法调用可以内联......