【发布时间】:2015-01-16 23:36:43
【问题描述】:
我对“Effective Java”中的“Builder Pattern”有疑问。我们是否需要一个.build() 方法才能正确实现该模式?例如,假设我们有以下类:
public class CoffeeDrink {
private int numEspressoShots;
private short milkType;
private boolean withWhip;
private CoffeeDrink() {
}
public static CoffeeDrink buildNewDrink() {
return new CoffeeDrink();
}
public CoffeeDrink withEspresso(int n) {
this.numEspressoShots = n;
return this;
}
public CoffeeDrink withMilkType(shot t) {
this.milkType = t;
return this;
}
public CoffeeDrink withWhip() {
this.withWhip = true;
return this;
}
}
然后我们如何使用它:
CoffeeDrink c = CoffeeDrink.buildNewDrink()
.withEspresso(2)
.withMilkType(2)
.withWhip();
如果我没有静态内部 Builder 类,这仍然有效吗?我想其中一个优点是它不会创建一个新的CoffeeDrink 对象,直到调用.build() 方法,但我仍在创建一个Builder 对象。只是寻求一些澄清。
【问题讨论】:
-
构建器模式在不可变类中发挥了巨大的优势。有了它们,Builder 是一个可变的“助手”类,它帮助最终构建最终产品,该产品此后是不可变的。您的示例只是一个简单的 POJO,它具有 JavaBeans 的缺点(可变,可以在不完整或不一致的状态下查看等)。
标签: java design-patterns builder effective-java