Java相对较新,我想知道哪种方法更好。我有一个类构造函数,它接受一些参数,在这个类中也是公共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并将检查放在那里。那更有意义吗?或者我违反了一些我完全不知道的惯例?
答案 0 :(得分:8)
从构造函数中调用可覆盖的方法是个坏主意。做更像这样的事情:
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
并希望验证设置器可用,请将其声明为protected final
而不是private
。
答案 1 :(得分:2)
对于相当简单的数据检查,例如您的示例,然后是,在setter中进行验证最有意义。但是,如果theValue
的验证还取决于theName
(或其他内容),那么在构造函数(或构造函数调用的私有方法)上执行验证可能是值得的。