java - 使用空构造函数强制先决条件

标签 java validation constructor preconditions

我有几个需要能够解析的对象,其中包括 Jersey 。这迫使我显式添加一个空构造函数,因为框架使用反射和空构造函数进行实例化。

我看到的问题是我不能强制任何先决条件。以下面的代码为例:

public class Model {
    /**
     * 0 < value < 100
     */
    int value;

    public Model() {} //The much needed empty constructor

    public Model(int value) {
        if(value < 1 || value > 99)
            throw new IllegalArgumentException("Value must be between 1 and 99 inclusive");
        this.value = value;
    }
}

这里的值确实有一个前提条件,根据使用情况,将其设置为任何默认值可能没有意义(例如,如果值是数据库中必须存在的 ID)。然而,由于其他框架需要一个空的构造函数,因此有可能创建一个破坏前提条件的 Model 对象,从而导致无效。

所以我有点好奇这个问题通常是如何解决的。有没有办法让空构造函数只为反射调用打开?或者接受它是错误的并在其中创建一个可以调用以确保前提条件成立的 isValid 函数是否更标准?或者可能有一个不同的 validator 对象来检查其有效性(以使模型与业务逻辑保持清晰)?

最佳答案

您遇到了一种情况,框架迫使您接受最初无效的对象的创建。据推测,框架必须在使用对象之前使用 setter 使对象有效。您可以使用生成器来确保只能创建有效的对象。您的框架只了解构建器,而不了解模型本身:

@Resource // or whatever your framework needs
public class ModelBuilder {
    private int value;

    public ModelBuilder() {}

    public setValue(int value) {
        if(value < 1 || value > 99)
            throw new IllegalArgumentException("Value must be between 1 and 99 inclusive");
        this.value = value;
    }

    public Model build() {
        if (value == 0)
            throw new IllegalStateException("Value must be set before building.");
        return new Model(value);
}

public class Model {
    /**
     * 0 < value < 100
     */
    private final int value;

    public Model(int value) {
        if(value < 1 || value > 99)
            throw new IllegalArgumentException("Value must be between 1 and 99 inclusive");
        this.value = value;
    }

    // Other methods...
}

关于java - 使用空构造函数强制先决条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49530860/

相关文章:

javascript - 在 jquery 中验证单选按钮

c++ - 检查 int 数据类型的输入是否有效

javascript - 仅允许字母数字和特殊字符的正则表达式不起作用

c++ - C++中构造函数的初始化顺序

java - 字符串作为新类的唯一私有(private)字段

java - java 中的preparedStatement 上的HP Fortify SQL 注入(inject)问题

c++ - 为什么我在 main 中声明的变量被初始化,就好像它是我的类的变量一样?

c++ - 对派生类 C++ 使用不同的基构造函数

java - 如何在 java 文件中包含 jar 文件并在命令提示符下编译

java - 从Excel文件中读取数据