我最近阅读了Effective Java,我发现Builder Pattern(第2项)非常有趣。 但是,我有一个问题:为什么我们应该在创建静态构建器时创建它:
// JavaBeans Pattern
public class NutritionFacts {
private int servingSize;
private int servings;
private int calories;
private int fat;
public NutritionFacts() {
}
public NutritionFacts servingSize(int val) {
this.servingSize = val;
return this;
}
public NutritionFacts servings(int val) {
this.servings = val;
return this;
}
public NutritionFacts calories(int val) {
this.calories = val;
return this;
}
public NutritionFacts fat(int val) {
this.fat = val;
return this;
}
}
//usage
NutritionFacts nf = new NutritionFacts().servingSize(5).servings(4).calories(3).fat(1);
执行此操作时,我们可以避免创建2个实例。
请您解释一下这种方法存在哪些问题?
答案 0 :(得分:3)
Builder
允许抽象构造过程。
假设你想让NutritionFacts
成为一个不可变的类。在这种情况下,Builder
可以提供所有的setter,最后调用一个私有的构造函数来获取所有这些(未设置的那些都填充了合理的默认值),而类本身不提供任何setter。
另一点是您可能希望对值集进行一些验证,尤其是值之间的关系。构建器模式将始终包含build()
方法,您可以执行此操作。
在您提供的示例中,它确实等同于Builder
或类本身中的setter方法。
答案 1 :(得分:2)
每一步都有一个不完整的对象。 Builder可以验证对象,这样可以保护人们不会滥用您的课程。