java - 有效的 Java : Builder Pattern

标签 java builder factory-pattern effective-java

我正在阅读 Effective java item# 2- The Builder pattern

http://www.informit.com/articles/article.aspx?p=1216151&seqNum=2

这里说java bean不是创建多参数对象的有效方式。 但是,如果我以这种方式拥有 javabean 怎么办:

// JavaBeans Pattern 
public class NutritionFacts {
private final int servingSize ;
private final int servings  ;
private final int calories;
private final int fat;
private final int sodium;
private final int carbohydrate;
public NutritionFacts() { }
// Setters
public void setServingSize(int val) { servingSize = val; }
public void setServings(int val) { servings = val; }
public void setCalories(int val) { calories = val; }
public void setFat(int val) { fat = val; }
public void setSodium(int val) { sodium = val; }
public void setCarbohydrate(int val) { carbohydrate = val; }
}

请注意,我将所有成员变量都设置为 Final

现在可以这样创建一个实例:

NutritionFacts cocaCola = new NutritionFacts();
cocaCola.setServingSize(240);
cocaCola.setServings(8);
cocaCola.setCalories(100);
cocaCola.setSodium(35);
cocaCola.setCarbohydrate(27);

这样做有什么问题吗?有人可以帮我理解吗? 谢谢, 拉詹

最佳答案

你甚至没有尝试编译它,因为不幸的是它会失败。这样做的原因是因为您声明了一个变量 final,它必须在构造函数完成时初始化。

顺便说一句,这就是为什么 final 变量上的 setter 没有意义,也是为什么通常使用 Builder 模式来解决这个问题。

关于java - 有效的 Java : Builder Pattern,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25973463/

相关文章:

java - 如何将文本字段(JFrame 1)的输入值传递给标签(JFrame 2)

Android 如何在点击后禁用正面按钮

c# - 使用 Ninject IOC 替换一个工厂

c# - 使用属性使用Autofac创建委托(delegate)工厂

java - Java中的模拟工厂模式

java - 从命令行启动 eclipse 时出错

java - 向 json 对象 java 中的数组添加新元素

java - Android 模拟器返回错误的日期

kotlin - 如何撰写以下Kotlin契约(Contract)?

java - 如何对在其 builder() 方法中使用静态单例工厂的构建器进行单元测试?