猿问

有效Java中的构建器模式

我最近开始阅读Joshua Bloch撰写的Effective Java。我发现构建器模式[书中的项目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在他的书中建议的示例。


达令说
浏览 619回答 3
3回答

一只斗牛犬

使构建器成为一个static类。然后它将起作用。如果它是非静态的,则将需要其拥有类的实例-重点是不要拥有它的实例,甚至禁止在没有构建器的情况下创建实例。public class NutritionFacts {    public static class Builder {    }}
随时随地看视频慕课网APP
我要回答