在Effective Java中删除Builder模式的Builder类

时间:2017-07-19 09:47:32

标签: java builder-pattern effective-java

我最近阅读了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个实例。

请您解释一下这种方法存在哪些问题?

2 个答案:

答案 0 :(得分:3)

Builder允许抽象构造过程。

假设你想让NutritionFacts成为一个不可变的类。在这种情况下,Builder可以提供所有的setter,最后调用一个私有的构造函数来获取所有这些(未设置的那些都填充了合理的默认值),而类本身不提供任何setter。

另一点是您可能希望对值集进行一些验证,尤其是值之间的关系。构建器模式将始终包含build()方法,您可以执行此操作。

在您提供的示例中,它确实等同于Builder或类本身中的setter方法。

答案 1 :(得分:2)

每一步都有一个不完整的对象。 Builder可以验证对象,这样可以保护人们不会滥用您的课程。