EffectiveJava[2]:遇到多个构造器参数时要考虑使用构建器

适用场景、要解决的问题:

需要扩展到大量可选参数(4个或以上),如用一个类表示包装食品外面显示的营养成分标签,其中有必需域和大量可选域,大部分情况下某几个可选域中有非零值。

应该规避的做法:

1-重叠构造器模式:
设置很多构造器,第一个构造器只有必要参数、第二个有一个可选参数、第三个有两个可选参数… …将所有情况都包含。虽然可行,但当有许多参数时,使用失去控制,难以阅读、容易出错。

2-JavaBeans模式:
先调用无参构造器来创建对象,再调用setter方法来设置所有的参数。创建实例容易、读起来容易,但是javabeans模式自身有很严重的缺点。构造过程被分到了几个调用中,再构造过程中JavaBean可能处于不一致的状态。除此之外,JavaBeans模式使类没办法做成不可变,需要程序员来控制线程安全。

应该使用的:建造者模式(Builder)。

既有重叠构造器模式的安全性、又有JavaBeans模式很好的可读性。
不直接生成对象,客户端(或静态工厂)利用所有必要参数调用构造器,得到build对象,然后客户端在build对象上调用setter方法设置相关参数。builder设值方法返回builder本身,以便把调用链接起来得到流式的api。

优点++:
也适用于类层次结构。与构造器相比,builder可以有多个可变参数。因为builder是利用单独方法来设置每个参数。可以多次调用某个方法实现将每次传入的参数集中到一个域中。

  • 6
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值