《effective java》读书笔记--(二)

遇到多个构造器参数时,要考虑用构建器。

写一个类,一般都会写它的构造函数,如果成员变量,有很多个,就带来了一个后果,就是构造函数,所带参数很长,可读性很差,同时需要重载多个构造函数,不方便,甚至在使用构造函数初始化一个类型,写错或者漏写参数,会给程序带来意想不到的后果。

诚然,我们可以使用javabean的方式来解决参数比较多的问题,这样会引进另一个问题:这样的类,线程不安全。当有多个线程对这个对象进行操作,使用set方法会造成对象状态的不统一,引入一个更大的问题。那么问题来了,能不能,当有多个参数时,初始化一个对象,兼顾安全性和可读性。Builder模式是个不错的选择。

书中的例子:

public class NutritionFacts {

    private final int servingSize;

    private final int serving;

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

       

        private int  calories = 0;

        private int fat = 0;

        private int sodium = 0;

        private int carbohydrate= 0;


        public Builder(int servingSize, int serving) {

         this.servingSize = servingSize;

         this.serving = serving;

        }

         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 NutritingFacts build() {

       return new NutritionFacts(this);

       }

}

 private NutritionFacts (Builder builder) {

       servingSize = builder.servingSize;

       serving = builder.serving;

       fat = builder.fat;

      calories = builder.calories;

      sodium = builder.sodium;

      carbohydrate = builder.carbohydrate;       

     }   

}


创建一个NutritionFacts对象时,尽管参数有很多,可以采用 NutritionFacts.Builder(240,8).calories(10).fat(20).sodium(34).carbohydrate(40).build()。

这样可读性达到了,而且使用起来十分灵活,也考虑到了安全性。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值