Effective Java 第二条:遇到多个构造器参数时要考虑用构建器

<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">对于Java处理多参数时,先给大家上两个程序员平时最喜爱用的写法:</span>
<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">
</span>
<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">第一:重叠构造器</span>

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(int servingSize, int servings) {
        this(servingSize,servings,0);
    }

    public NutritionFacts(int servingSize, int servings, int calories) {
        this(servingSize,servings,calories,0);
    }

    public NutritionFacts(int servings, int servingSize, int caloriesm, int fat) {
        this(servings,servingSize,caloriesm,fat,0);
    }

    public NutritionFacts(int calories, int fat, int servings, int servingSize, int sodium) {
        this(calories,fat,servings,servingSize,sodium,0);
    }

    public NutritionFacts(int calories, int servingSize, int servings, int fat, int sodium, int carbohydrate) {
        this.calories = calories;
        this.servingSize = servingSize;
        this.servings = servings;
        this.fat = fat;
        this.sodium = sodium;
        this.carbohydrate = carbohydrate;
    }
}


客户端调用:

NutritionFacts facts = new NutritionFacts(12,34,2,5,3,5);

第二:JavaBean模式

public class NutritionFactsJavaBean {  //JavaBean模式
    private  int servingSize;
    private  int servings;
    private  int calories;
    private  int fat;
    private  int sodium;
    private  int carbohydrate;

    public NutritionFactsJavaBean() {
    }

    public void setCalories(int calories) {
        this.calories = calories;
    }

    public void setCarbohydrate(int carbohydrate) {
        this.carbohydrate = carbohydrate;
    }

    public void setFat(int fat) {
        this.fat = fat;
    }

    public void setServings(int servings) {
        this.servings = servings;
    }

    public void setServingSize(int servingSize) {
        this.servingSize = servingSize;
    }

    public void setSodium(int sodium) {
        this.sodium = sodium;
    }
}


客户端调用:

NutritionFactsJavaBean factsJavaBean = new NutritionFactsJavaBean();
        factsJavaBean.setCalories(34);
        factsJavaBean.setCarbohydrate(33);
        factsJavaBean.setFat(333);
        factsJavaBean.setServings(345);


以上两种构造器弊端总结:重叠构造器模式可行,但是当有许多参数时,客户端代码会很难编写,难以阅读。JavaBean模式类无法仅仅通过检验构造器参数的有效性保持一致性,并且导致线程不安全。综上,遇到多参数时,统一推荐大家使用构建器,既能有重叠构造器的安全,又能有JavaBean模式的可读性。


遇到多参数,推荐使用构建器:

public class NutritionFactsBuilder { //构建器模式
    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{
        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 NutritionFactsBuilder build(){
            return new NutritionFactsBuilder(this);
        }
    }

    private NutritionFactsBuilder(Builder builder){
        servings = builder.servings;
        servingSize = builder.servingSize;
        calories = builder.calories;
        fat = builder.fat;
        sodium = builder.sodium;
        carbohydrate = builder.carbohydrate;
    }

}


客户端调用:

NutritionFactsBuilder builder = new NutritionFactsBuilder.Builder(12,34)
                .calories(44)
                .carbohydrate(55)
                .fat(456)
                .sodium(23)
                .build();

以上内容整理自《Effective Java》。大家最好运行代码感受一下喔。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值