3

对 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 并将检查放在那里。这更有意义吗?还是我违反了一些我完全不知道的约定?

4

2 回答 2

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;
    }
}

这为您提供了两个地方的验证,并消除了对可覆盖方法的调用。有关此问题的更多信息,请参阅此问题。

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

于 2012-09-13T16:04:46.620 回答
2

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

于 2012-09-13T16:02:40.110 回答