Effective Java读书笔记二

       

Item 2:当构造函数参数过多时考虑使用Builder来创建对象

 

我们在设计类的时候,有些类难免会有许多的字段(fields),而这些字段可能需要在创建对象的时候对它们进行赋值。一般我们会考虑两种方式:使用构造函数或者使用setter方法。

使用构造函数的缺点很明显,如果我们的字段过多,那么就会让构造函数的参数过多,在这种情况下,不但不容易理解和阅读,而且非常容易出错(这时候就体现出具名参数的好处了)。另外,对于static factory methods也是一样的。

而使用setter方法可以减少构造函数的参数,但是需要在对象创建完成后调用setter方法为其它的字段赋值。这样就会造成对象状态的不稳定性,同样也会存在线程安全性。

 

在上面描述的这种情况下,Joshua建议使用Builder模式来创建对象。使用Builder模式时,可以先用必须的字段创建一个builder对象,然后再调用builder对象的类setter方法来给其它字段赋值。等把需要赋值的字段全部完成后,最后调用builder对象的build方法创建真正我们需要的对象,这样就能保证我们的对象是immutable的。下面是从书上摘抄出的例子:
有了Builder模式,我们就可以这样创建NutritionFacts的对象:


从上面的使用中可以看出,Builder模式模拟了具名参数,可以提高代码的可读性和维护性,降低使用的风险。

 

不过,Builder模式也有显著的缺点,最明显的就是每次创建对象的时候都要额外的创建一个builder对象,这个对于注重性能的系统是一个问题。另外,Builder模式从形式上也要比一般的构造函数复杂。所以Joshua建议除非构造函数的参数很多,而且大部分都是可选的,否则首先还是不要考虑Builder模式。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值