【发布时间】:2012-09-13 15:59:50
【问题描述】:
对于 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 < 0.0f) {
this.value = 0.0f;
} else if (v > 1.0f) {
this.value = 1.0f;
}
}
这段代码最初在构造函数中进行边界检查,然后在 setter 中再次检查,这似乎是多余的。我更改了构造函数以调用 setter 并将检查放在那里。这更有意义吗?还是我违反了一些我完全不知道的约定?
【问题讨论】:
-
在我看来你做得对。 (A) setter 的要点是提供验证以“保护”您的类的属性。
-
显然是在 setter 中,因为它已在此处公开,因此在创建对象后可能会更改值。
-
实际上没有正确的方法,我不喜欢你的方法,我会让setter只是设置值,并在setter之外执行绑定检查,因为它可能是将来会令人困惑,或者至少将其分离在类中的私有函数中,例如私有值 valueBoundsChecking(val){(logic....)return x} 然后, setValue(value v){this.value=valueBoundsChecking (v);},或类似的东西
-
我只想指出,在发布的示例中,在构造函数和设置器中都进行了验证。验证代码本身不在构造函数本身内,但在运行
new MySampleClass()时仍会运行验证 - 这是一个与问题可能被解释为略有不同的问题。您在这里所做的只是代码的智能重用。
标签: java coding-style constructor getter-setter