java - 最适合边界检查的地方——构造函数还是设置函数?

标签 java coding-style constructor getter-setter

对 Java 还是比较陌生,我想知道哪种方法可以更好地处理这个问题。我有一个带有一些参数的类构造函数,并且在这个类中还有公共(public)的 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 并将检查放在那里。这更有意义吗?还是我违反了一些我完全没有意识到的惯例?

最佳答案

从你的构造函数中调用可覆盖的方法是个坏主意。做更多像这样的事情:

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 并希望验证 setter 可用,请将其声明为 protected final 而不是 private.

关于java - 最适合边界检查的地方——构造函数还是设置函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12410338/

相关文章:

java - 关于“分配分支条件”的值范围

c# - 样式数据网格表 - 左上角

c++ - c++中的构造函数使用[]而不是括号创建对象

给定底层数据库最大连接设置的java最佳jdbc池大小

java - 从另一个类混淆调用方法(机器人类)

java - Spring ApplicationContext 和 BeanFactory

java边框图形用户界面

C++ 模板实现文件扩展名约定?

c# - 如何在传递时修改 DbContext 基本构造函数参数?

c++ - 完美转发构造函数的包装器