Java 使用Builder解决构造函数参数过多的问题

Effective Java学习笔记:

  构造函数中,如果需要初始化的参数很多,那么为每种初始化方式都写一个构造函数的话,工作会过于繁重。通过使用Builder模式,可以解决构造函数中参数过多的问题。

定义一个内部类Builder,其成员变量与外部类一致;
为外部类中每一个(可选)变量各定义一个类似setter()的方法;
Builder的构造函数返回外部类的实例。

//Builder Pattern
public class NutritionFacts{
    
    
    public final int servingSize;
    public final int servings;
    public final int calories;
    public final int fat;
    public final int sodium;
    public final int carbohydrate;

    //静态内部类Builder
    public static class Builder{
    
    
        //必选变量
        private final int servingSize;
        private final int servings;

        //可选变量
        private final int calories = 0;
        private final int fat = 0;
        private final int sodium= 0;
        private final int carbohydrate= 0;

        //Builder的构造函数
        public Builder(int servingSize, int servings){
            this. servingSize = servingSize;
            this.servings = servings;
        }


        //Builder的成员方法返回其自身,所以可以链式调用
        //类似于setter()方法
        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;
        }

        //Builder的build方法,返回外部类的实例
        public NutritionFacts build(){
            return new NutritionFacts(this);
        }
    }

    //外部类的构造函数
    private NutritionFacts(Builder build){
        servingSize = build.servingSize;
        servings = build.servings;
        calories = build.calories;
        fat = build.fat;
        sodium = build.sodium;
        carbohydrate = build.carbohydrate;
    }
}

示例:

NutritionFacts cocaCola = new NutritionFacts.Builder(240, 8).calories(100).sodium(35).carbohydrate(27).build();

猜你喜欢

转载自blog.csdn.net/michael_f2008/article/details/77715075