AWT*_*AWT 3 java constructor coding-style getter-setter
对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;
}
Run Code Online (Sandbox Code Playgroud)
我想对这个Float做一些检查.它似乎是最好的地方,它将在setter中:
public value setValue(Float v) {
if (v < 0.0f) {
this.value = 0.0f;
} else if (v > 1.0f) {
this.value = 1.0f;
}
}
Run Code Online (Sandbox Code Playgroud)
这段代码最初在构造函数中检查了边界,并在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;
}
}
Run Code Online (Sandbox Code Playgroud)
这使您可以在两个位置进行验证,并消除对可覆盖方法的调用.有关详细信息,请参阅此问题.
编辑:如果您计划进行子类化MySampleClass并希望验证设置器可用,请声明它protected final而不是private.