哪种构建器方法更可取?

3

我正在阅读Joshua Bloch的"Effective Java第二版"。我的问题是关于第2条建议"当遇到多个构造器参数时考虑使用构建器(Builder)"

以下是书中的一个简化示例:

public class NutritionFacts {
    private final int calories;

    public static class Builder {
        private int calories = 0;

        public Builder(){}

        public Builder calories(int val) {
            calories = val;
            return this;
        }

        public NutritionFacts build(){
           return new NutritionFacts(this);
        }
    }

    private NutritionFacts(Builder builder){
        calories = builder.calories;
    }
}

请调用它:NutritionFacts cocaCola = new NutritionFacts.Builder().calories(300).build()

我的版本

public class NutritionFacts {
    private int calories;

    public NutritionFacts calories(int calories) {
        this.calories = calories;
        return this;
    }
}

调用:NutritionFacts cocaCola = new NutritionFacts().calories(300);

那么这个书中的例子有什么优势呢?我只看到了不可变性,而我的解决方案并不可行。


4
是的,不变性就是它。你的实现实际上根本不是一个构建器 - 它只是一个可变类型。如果你想要一个可变类型,你不需要一个构建器。个人而言,在许多情况下我喜欢不变性。 - Jon Skeet
1
首先,您错误地调用了第一个构建器,您创建了两个NutritionFacts实例。您应该执行 NutritionFacts.Builder().calories(300).build()Builder().calories(300).build(),其次,如@JonSkeet所说,您的实现不是一个构建器。 - user902383
1个回答

1

您是否在使用Eclipse?如果是的话,我建议您安装插件Fluent Builder。我经常使用它来生成实体的构造器以进行测试。

此插件生成了一个非常好的构造器示例。我必须承认,它不是纯Builder模式而是流畅模式。无论如何,我相信它的代码对于您学习Builder模式及其优势非常有帮助。


不,我正在使用IntelliJ。问题不是关于生成器或建造者的目的。 - GarfieldKlon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接