我正在使用构建器模式构建一个 JavaBean(只有字段和 getter/setter)。
为了这个例子,假设这是我们的 bean:
public class Pizza {
private int size;
private boolean cheese;
private boolean pepperoni;
private boolean bacon;
private Pizza(Builder builder) {
size = builder.size;
cheese = builder.cheese;
pepperoni = builder.pepperoni;
bacon = builder.bacon;
}
public static class Builder {
//required
private final int size;
//optional
private boolean cheese = false;
private boolean pepperoni = false;
private boolean bacon = false;
public Builder(int size) {
this.size = size;
}
public Builder cheese(boolean value) {
cheese = value;
return this;
}
public Builder pepperoni(boolean value) {
pepperoni = value;
return this;
}
public Builder bacon(boolean value) {
bacon = value;
return this;
}
public Pizza build() {
return new Pizza(this);
}
}
}
取自这里。
现在我一直在尝试确保其中的所有字段Pizza
都是非空的,通过反射,遍历字段Pizza
并检查它们不为空,但看起来(我在这里可能是错的)我的字段是'在检查发生之前不设置。Jon Skeet 的这段代码是我为了检查我的字段的非空性而改变的(而不是计数,我抛出异常)。
然后我尝试检查构建器的字段,但构建器中有额外的字段(例如,我有一个可能为空的 XMLParser 字段)。通过比萨字段对构建器字段进行子集化不起作用,因为它们具有不同的“包路径”(?),例如vsorg.GiusepesPizzaria.pizza.size
org.GiusepesPizzaria.builder.size
有没有更好的方法来检查这个?在实现反射方法之前,我使用了这种构造:
if(builder.size ==null){
throw new BadPizzaException("Eh, what're ya doin'?"+
" Pizza Size was not set correctly");
}else{
size=builder.size;
}
但它最终,如果你说要检查大约 10 个字段,冗长的,杂乱无章的应该是一个简单的类。
所以这就是我尝试过的。有没有更好的方法?