java - 有效 Java 中的构建器模式

标签 java design-patterns builder-pattern

我最近开始阅读 Joshua Bloch 的 Effective Java。我发现 Builder 模式的想法 [书中的第 2 项] 非常有趣。我试图在我的项目中实现它,但出现编译错误。以下本质上是我想要做的:

具有多个属性的类及其构建器类:

public class NutritionalFacts {
    private int sodium;
    private int fat;
    private int carbo;

    public class Builder {
        private int sodium;
        private int fat;
        private int carbo;

        public Builder(int s) {
            this.sodium = s;
        }

        public Builder fat(int f) {
            this.fat = f;
            return this;
        }

        public Builder carbo(int c) {
            this.carbo = c;
            return this;
        }

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

    private NutritionalFacts(Builder b) {
        this.sodium = b.sodium;
        this.fat = b.fat;
        this.carbo = b.carbo;
    }
}

我尝试使用上述类的类:

public class Main {
    public static void main(String args[]) {
        NutritionalFacts n = 
            new NutritionalFacts.Builder(10).carbo(23).fat(1).build();
    }
}

我收到以下编译器错误:

an enclosing instance that contains effectivejava.BuilderPattern.NutritionalFacts.Builder is required NutritionalFacts n = new NutritionalFacts.Builder(10).carbo(23).fat(1).build();

我不明白消息的含义。请解释。上面的代码和 Bloch 在他的书中建议的例子很相似。

最佳答案

使构建器成为 static 类。然后它将起作用。如果它是非静态的,则需要其所属类的实例 - 关键是不要拥有它的实例,甚至禁止在没有构建器的情况下创建实例。

public class NutritionFacts {
    public static class Builder {
    }
}

引用:Nested classes

关于java - 有效 Java 中的构建器模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5007355/

相关文章:

actionscript-3 - 如何避免使用接口(interface)重用相同的实现代码?

java - 当工厂需要创建具有多个公共(public)参数的对象时,如何解决困境?

java - 构建器模式代替方法重载

java - 如何将POST中的json转换为javaBean

java - 进度对话框异步任务花费的时间比预期的要长

java - 添加库后无法合并dex错误

java - 实现构建器模式的错误/正确方法是什么?

java - 将 List<String> 转换为 List<MyObject>,其中 MyObject 包含一个表示顺序的 int

c# - 自动生成不可变类和匹配的构建器类

Java Webservice 和 .NET 客户端丢弃 DateTime 对象