我最近阅读了《有效的Java》,发现“构建器模式”(项目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个实例。
您能解释一下这种方法的问题吗?
最佳答案
Builder
允许抽象化构造过程。
只是假设您想让您的NutritionFacts
是一个不可变的类。在这种情况下,Builder
可以提供所有的setter,最后调用一个私有的构造函数来接受所有的设置器(未设置的构造器将填充合理的默认值),而类本身不提供任何setter。
另一点是,您可能需要对设置的值进行一些验证,尤其是值之间的关系。构建器模式将始终包含build()
方法,您可以在其中执行此操作。
在您提供的示例中,在Builder
或类本身中确实具有setter方法是等效的。