使用空构造函数强制前提条件
forcing preconditions with empty constructor
我有几个对象需要能够解析,其中包括球衣。这迫使我显式添加一个空构造函数,因为框架正在使用反射和空构造函数进行实例化。
我看到的问题是我不能强制任何先决条件。以下面的代码为例:
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
函数,您可以调用该函数来确保先决条件成立?或者可能有一个不同的验证器对象来检查其有效性(以使模型与业务逻辑保持清晰)?
您遇到的情况是框架强制您接受最初无效对象的创建。据推测,框架必须在使用之前使用 setter 使对象有效。您可以使用 Builder 来确保只能创建有效的对象。您的框架只知道构建器,不知道模型本身:
@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...
}
我有几个对象需要能够解析,其中包括球衣。这迫使我显式添加一个空构造函数,因为框架正在使用反射和空构造函数进行实例化。
我看到的问题是我不能强制任何先决条件。以下面的代码为例:
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
函数,您可以调用该函数来确保先决条件成立?或者可能有一个不同的验证器对象来检查其有效性(以使模型与业务逻辑保持清晰)?
您遇到的情况是框架强制您接受最初无效对象的创建。据推测,框架必须在使用之前使用 setter 使对象有效。您可以使用 Builder 来确保只能创建有效的对象。您的框架只知道构建器,不知道模型本身:
@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...
}