首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Effective Java中删除Builder模式的Builder类

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

Stack Overflow用户
提问于 2017-07-19 17:47:32
回答 2查看 496关注 0票数 0

我最近阅读了Effective,我发现Builder模式(item #2)非常有趣。然而,我有一个问题:既然我们可以这样做,为什么还要创建一个静态构建器:

代码语言:javascript
复制
 // 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个实例。

你能解释一下这种方法有什么问题吗?

EN

回答 2

Stack Overflow用户

发布于 2017-07-19 17:56:16

Builder允许抽象构造过程。

假设你想让你的NutritionFacts是一个不可变的类。在这种情况下,Builder可以提供所有的设置器,并最终调用一个接受所有设置器的私有构造函数(未设置的构造器用合理的默认值填充),而类本身不提供任何设置器。

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

在您提供的示例中,setter方法实际上等同于在Builder或类本身中具有设置器方法。

票数 3
EN

Stack Overflow用户

发布于 2017-07-19 18:02:24

在每一步,你都有一个不完整的对象。构建器可以验证对象,这样您就可以保护人们不会滥用您的类。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45186879

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档