美文网首页
Effective2. 遇到多个构造器参数时要考虑使用构建器

Effective2. 遇到多个构造器参数时要考虑使用构建器

作者: 小蜜蜂_Jade | 来源:发表于2020-06-22 17:46 被阅读0次
    why?

    当创建实例时,构造器包含多个必选参数,则创建时必须对多个参数赋值。

    解决方案
    1. 以往解决方案一般是重叠构造器模式。但容易代码量过多,不简洁。
    2. JavaBeans模式:先调用一个无参构造器来创建对象,然后再调用setter方法来设置每个必要的参数,以及每个相关的可选参数。
      弊端:在构造过程,JavaBean可能处在不一致的状态;把类做成不可变的可能性不复存在。
    3. 建造者(Builder)模式:不直接生成想要的对象,而是让客户端利用必要的参数调用构造器(或静态工厂),得到一个builder对象。然后客户端在builder对象上调用类似setter的方法,来设置每个相关的可选参数。最后,客户端调用无参的build方法来生成通常是不可变的对象。这个builder通常是它构建的类的静态成员类。
    public class NutritionFacts {
    
        private final int servingSize;
        private final int servings;
        private final int calories;
        private final int fat;
        private final int sodium;
        private final int carbohydrate;
    
    
        public NutritionFacts(Builder builder) {
            servingSize = builder.servingSize;
            servings = builder.servings;
            calories = builder.calories;
            fat = builder.fat;
            sodium = builder.sodium;
            carbohydrate = builder.carbohydrate;
        }
    
        /**
         * builder的设值方法返回builder本身,以便把调用链接起来,得到一个流式的API.
         */
        public static class Builder {
    
            private final int servingSize;
            private final int servings;
    
            private int calories = 0;
            private int fat = 0;
            private int sodium = 0;
            private int carbohydrate = 0;
    
    
            public Builder(int servingSize, int servings) {
                this.servingSize = servingSize;
                this.servings = servings;
            }
    
            public Builder calories(int val) {
                calories = val;
                return this;
            }
    
            public Builder fat(int val) {
                fat = val;
                return this;
            }
    
            public Builder sodium(int val) {
                sodium = val;
                return this;
            }
    
            public Builder carbohydrate(int val) {
                carbohydrate = val;
                return this;
            }
    
            public NutritionFacts build() {
                return new NutritionFacts(this);
            }
        }
    }
    

    未完待看...

    相关文章

      网友评论

          本文标题:Effective2. 遇到多个构造器参数时要考虑使用构建器

          本文链接:https://www.haomeiwen.com/subject/dnxbxktx.html