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

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

Bri*_*ian 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

编辑:如果您计划进行子类化MySampleClass并希望验证设置器可用,请声明它protected final而不是private.

  • 为此"+1"从构造函数中调用可覆盖的方法是一个坏主意" (2认同)