看着约书亚·布洛赫(Joshua Bloch)在Java中做构建器模式的方式,我有这个类:
public class NutritionFacts { private final int calories; private final int fat; private final int sodium; public static class Builder { private int calories = 0; private int fat = 0; private int sodium = 0; public Builder calories(int val) { calories = val; return this; } public Builder fat(int val) { fat = val; return this; } public Builder carbohydrate(int val) { carbohydrate = val; return this; } public Builder sodium(int val) { sodium = val; return this; } public NutritionFacts build() { return new NutritionFacts(this); } } private NutritionFacts(Builder builder) { calories = builder.calories; fat = builder.fat; sodium = builder.sodium; } }
我可以通过这种方式调用以实例化NutritionualFacts对象:
NutritionFacts cocacola = new NutritionFacts.Builder().calories(140).build()
我可以在这个班上也有一些变化:
public class NutritionFacts { private final int calories; private final int fat; private final int sodium; public static class Builder { private int calories = 0; private int fat = 0; private int sodium = 0; private Builder(){ } public Builder calories(int val) { calories = val; return this; } public Builder fat(int val) { fat = val; return this; } public Builder carbohydrate(int val) { carbohydrate = val; return this; } public Builder sodium(int val) { sodium = val; return this; } public NutritionFacts build() { return new NutritionFacts(this); } } public static Builder builder(){ return new Builder() } private NutritionFacts(Builder builder) { calories = builder.calories; fat = builder.fat; sodium = builder.sodium; } }
现在,我可以执行此操作以创建NutritionFacts的实例:
NutritionFacts cocacola = NutritionFacts.builder().calories(140).build()
应用构建器模式的首选方法是什么?在结果(干净,不变性等)方面,上述两种方法是否完全相同?第二种方法有什么问题吗?
我想请您对此提出专家意见。
[查看Jousha Bloach在Java中进行构建器模式的方式,我上了此类:公共类NutritionFacts {私人最终int脂肪;私人最终int钠; ...
第二个在现有代码中更为常见。它们几乎完全相同,因此很难为任何一种形式争论基本风格,只是我猜第二种形式都较短,并且使用的外来语言功能更少(我猜称内部构造函数是非常外来的)。请注意,某些IDE配置会自动尝试通过在顶部添加:import com.foo.yourpackage.NutritionFacts.Builder;
并将代码转换为:new Builder().calories(140).build();
来“帮助您”,这也不是您想要的。同样,当仔细阅读NutritionFacts
类的javadoc时,如何用第一种形式制作一个可能并不明显。而如果有明确的静态builder()
方法,我会立即看到。