小编典典

有效Java中的构建器模式

python

我最近开始阅读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();
    }
}

我收到以下编译器错误:

一个包含有效java.BuilderPattern.NutritionalFacts.Builder的封闭实例。NutritionalFacts n = new NutritionalFacts.Builder(10).carbo(23).fat(1).build();

我不明白该消息的含义。请解释。上面的代码类似于Bloch在他的书中建议的示例。


阅读 157

收藏
2021-01-20

共1个答案

小编典典

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

public class NutritionFacts {
    public static class Builder {
    }
}
2021-01-20