首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Effective Java中的构建器模式

Effective Java中的构建器模式
EN

Stack Overflow用户
提问于 2011-02-16 01:48:25
回答 11查看 123.4K关注 0票数 140

我最近开始阅读Joshua Bloch的Effective。我发现书中关于构建器模式的想法非常有趣。我试图在我的项目中实现它,但出现了编译错误。以下是我想要做的事情:

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

代码语言:javascript
复制
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;
    }
}

类,其中我尝试使用上面的类:

代码语言:javascript
复制
public class Main {
    public static void main(String args[]) {
        NutritionalFacts n = 
            new NutritionalFacts.Builder(10).carbo(23).fat(1).build();
    }
}

我得到以下编译器错误:

需要新的包含effectivejava.BuilderPattern.NutritionalFacts.Builder的封闭实例n=

NutritionalFacts.Builder(10).carbo(23).fat(1).build();

我不明白这条信息是什么意思。请解释一下。上面的代码类似于Bloch在他的书中建议的示例。

EN

回答 11

Stack Overflow用户

回答已采纳

发布于 2011-02-16 01:54:21

使构建器成为static类。那么它就会起作用。如果它是非静态的,它将需要它所拥有的类的一个实例-关键是不能有它的实例,甚至禁止在没有构建器的情况下创建实例。

代码语言:javascript
复制
public class NutritionFacts {
    public static class Builder {
    }
}

参考:Nested classes

票数 178
EN

Stack Overflow用户

发布于 2015-08-01 03:44:42

您应该将Builder类设置为静态的,还应该将字段设为final,并使用getter来获取这些值。不要为这些值提供setter。通过这种方式,你的类将是完全不变的。

代码语言:javascript
复制
public class NutritionalFacts {
    private final int sodium;
    private final int fat;
    private final int carbo;

    public int getSodium(){
        return sodium;
    }

    public int getFat(){
        return fat;
    }

    public int getCarbo(){
        return carbo;
    }

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

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

        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;
    }
}

现在,您可以按如下方式设置属性:

代码语言:javascript
复制
NutritionalFacts n = new NutritionalFacts.Builder().sodium(10).carbo(15).
fat(5).build();
票数 28
EN

Stack Overflow用户

发布于 2014-01-31 18:09:45

要在Intellij IDEA中生成内部构建器,请查看此插件:https://github.com/analytically/innerbuilder

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

https://stackoverflow.com/questions/5007355

复制
相关文章

相似问题

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