最合适的边界检查 - 构造函数或setter?

时间:2012-09-13 15:59:50

标签: java coding-style constructor 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;
}

我想对这个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并将检查放在那里。那更有意义吗?或者我违反了一些我完全不知道的惯例?

2 个答案:

答案 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(或其他内容),那么在构造函数(或构造函数调用的私有方法)上执行验证可能是值得的。