java如何确保正确构建bean?
我正在使用构建器模式构建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
中的字段并检查它们是否为空,但是在检查发生之前,似乎没有设置我的字段(这里我可能错了)^Jon Skeet的{a2}是我用来检查字段是否为非空的内容(而不是计数,而是抛出异常)
然后,我尝试检查构建器的字段,但是在构建器中有额外的字段(例如,我有一个XMLParser字段,它可能为空)。按pizza字段子集生成器字段不起作用,因为它们具有不同的“包路径”(?),e、 g.org.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个字段要检查的话,它最终会变成一个冗长、混乱的简单类
这就是我尝试过的。有更好的方法吗
# 1 楼答案
试试这个:
有了上面的建筑商,建筑商不可能生产出无效的比萨饼
假设:仅支持9英寸和12英寸比萨饼。根据需要添加更多设置大小
构建器使用我所说的NMsetter。此样式设置器允许您设置值,但不公开所述值的实现。这似乎不是我的原创发明
# 2 楼答案
确保设置所有变量的一个有趣模式是使用Step Builder Pattern,其中第一个setter只允许设置第二个,第二个只允许设置第三个,依此类推。当您完成最后一步时,您可以构建该类,到那时您将知道所有方法都已被调用
那篇文章的简短摘录:
你必须从帕尼诺开始,然后是面包