最合适的边界检查 – 构造函数或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; } 

我想对这个Float做一些检查。 看起来最好把它放在setter中:

 public value setValue(Float v) { 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; } } 

这使您可以在两个位置进行validation,并消除对可覆盖方法的调用。 有关详细信息,请参阅此问题 。

编辑:如果您计划MySampleClass并希望validation设置器可用,请将其声明为protected final而不是private

对于相当简单的数据检查,例如您的示例,那么是,在setter中进行validation最有意义。 但是,如果对theValue的validation还取决于theValue (或其他内容),那么在构造函数(或构造函数调用的私有方法)中执行validation可能是值得的。