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

  • 重叠构造器(telescoping constructor)模式 —— 代码复杂,阅读困难

示例代码: 

// Telescoping constructor pattern - does not scale well!
public class NutritionFacts {
    private final int servingSize;    // (ml)            required
    private final int servings;    // (per container)    required
    private final int calories;    //            optional
    private final int fat;        // (g)            optional
    private final int sodium;    // (mg)            optional
    private final int carbohydrate; // (g)            optional
 
    public NutritionFacts( int servingSize, int servings) {
        this(servingSize, servings, 0);
    }
 
    public NutritionFacts( int servingSize, int servings, int calories) {
        this(servingSize, servings, calories, 0);
    }
 
    public NutritionFacts( int servingSize, int servings, int calories, int fat) {
        this(servingSize, servings, calories, fat, 0);
    }
 
    public NutritionFacts( int servingSize, int servings, int calories, int fat, int sodium) {
        this(servingSize, servings, calories, fat, sodium, 0);
    }
 
    public NutritionFacts( int servingSize, int servings, int calories, int fat, int sodium, int carbohydrate) {
        this.servingSize = servingSize;
        this.servings = servings;
        this.calories = calories;
        this.fat = fat;
        this.sodium = sodium;
        this.carbohydrate = carbohydrate;
    }
}
public class Client {
    public static void main(String[] args) {
        NutritionFacts cocaCola = new NutritionFacts( 240, 8, 100, 0, 35, 27);
    }
}
 
  • JavaBean模式 —— 线程不安全,类可变

示例代码:

// JavaBean Pattern - allows inconsistency, mandates mutability
public class NutritionFacts {
    // Parameters initialized to default values (if any)
    private int servingSize  = - 1; // Required; no default value
    private int servings     = - 1;
    private int calories     = 0;
    private int fat          = 0;
    private int sodium       = 0;
    private int carbohydrate = 0;
 
    public NutritionFacts() {
    }
 
    // Setters
    public void setServingSize( int servingSize) {
        this.servingSize = servingSize;
    }
 
    public void setServings( int servings) {
        this.servings = servings;
    }
 
    public void setCalories( int calories) {
        this.calories = calories;
    }
 
    public void setFat( int fat) {
        this.fat = fat;
    }
 
    public void setSodium( int sodium) {
        this.sodium = sodium;
    }
 
    public void setCarbohydrate( int carbohydrate) {
        this.carbohydrate = carbohydrate;
    }
}

 

public class Client {
    public static void main(String[] args) {
        NutritionFacts cocaCola = new NutritionFacts();
        cocaCola.setServingSize( 240);
        cocaCola.setServings( 8);
        cocaCola.setCalories( 100);
        cocaCola.setSodium( 35);
        cocaCola.setCarbohydrate( 27);
    }
}

 

  • 构建器模式 —— 适应多参数,安全,方便编写,可维护性高,开销大

示例代码:

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 static class Builder
    {
        // Required parameters
        private final int servingSize;
        private final int servings;
        // Optional parameters - initialized to default values
        private int calories = 0;
        private int fat = 0;
        private int carbohydrate = 0;
        private int sodium = 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 carbohydrate( int val)
        {
            carbohydrate = val;
            return this;
        }
 
        public Builder sodium( int val)
        {
            sodium = val;
            return this;
        }
 
        public NutritionFacts build()
        {
            return new NutritionFacts( this);
        }
    }
 
    private NutritionFacts(Builder builder)
    {
        servingSize = builder.servingSize;
        servings = builder.servings;
        calories = builder.calories;
        fat = builder.fat;
        sodium = builder.sodium;
        carbohydrate = builder.carbohydrate;
        //对象域抛出异常
        if( this.fat > this.sodium){
            throw new IllegalArgumentException( "The fat must be little than sodium!!");
        }
    }
}

 

public class Client {
    public static void main(String[] args) {
        NutritionFacts cocaCola = new NutritionFacts.Builder( 240, 8)
                .calories( 100).sodium( 35).carbohydrate( 27).build();
    }
}

 


 





转载于:https://www.cnblogs.com/aqxyjay/p/3462825.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值