【发布时间】:2013-05-15 11:43:32
【问题描述】:
我正在使用构建器模式构建一个 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);
}
}
}
取自here。
现在我一直在努力确保Pizza 中的所有字段都是非空的,通过反射,遍历Pizza 的字段并检查它们不为空,但它出现了(而且我这里可能是错的)我的字段在检查发生之前没有设置。 This code by Jon Skeet 是我为了检查我的字段的非空性而改变的(而不是计数,我抛出异常)。
然后我尝试检查构建器的字段,但构建器中有额外的字段(例如,我有一个可能为空的 XMLParser 字段)。通过比萨字段对构建器字段进行子集不起作用,因为它们具有不同的“包路径”(?),例如org.GiusepesPizzaria.pizza.size vs 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 个字段,那么它就会结束,冗长且杂乱无章,应该是一个简单的类。
这就是我尝试过的。有没有更好的方法?
【问题讨论】:
-
字段是否设置不应该是“可能”的情况。一旦你设置它们,它们就设置好了。不过,请确保您正在测试正确的字段:
Builder中的字段,而不是Pizza中的字段。 -
@MarkoTopolnik 我正在从内存中复制方法。当我有机会时,我会更新我的问题。不过,一般问题仍然存在。
-
一般来说,反射是处理大量
null-checking 的好方法。