对 Java 还是比较陌生,我想知道哪种方法可以更好地处理这个问题。我有一个带有一些参数的类构造函数,并且在这个类中还有公共(public)的 getter 和 setter:
private String name;
private Float value;
public MySampleClass(String theName, Float theValue) {
setName(theName);
setValue(theValue);
}
public void setName(String n) {
this.name = n;
}
public value setValue(Float v) {
this.value = v;
}
我想对这个 Float 做一些边界检查。似乎最好的放置位置是二传手:
public value setValue(Float v) {
if (v < 0.0f) {
this.value = 0.0f;
} else if (v > 1.0f) {
this.value = 1.0f;
}
}
此代码最初在构造函数中进行了边界检查,并在 setter 中进行了检查,这似乎是多余的。我更改了构造函数以调用 setter 并将检查放在那里。这更有意义吗?还是我违反了一些我完全没有意识到的惯例?
最佳答案
从你的构造函数中调用可覆盖的方法是个坏主意。做更多像这样的事情:
private String name;
private Float value;
public MySampleClass(String theName, Float theValue) {
this.name = theName;
setValueImpl(theValue);
}
public void setName(String n) {
this.name = n;
}
public void setValue(Float v) {
setValueImpl(v);
}
private void setValueImpl(Float v) {
if (v < 0.0f) {
this.value = 0.0f;
} else if (v > 1.0f) {
this.value = 1.0f;
}
}
这为您提供了两个地方的验证并消除了对可覆盖方法的调用。参见 this question有关更多信息。
编辑:如果您计划继承 MySampleClass
并希望验证 setter 可用,请将其声明为 protected final
而不是 private
.
关于java - 最适合边界检查的地方——构造函数还是设置函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12410338/