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

静态工厂和构造器有个共同的局限性:他们都不能很好地扩展到大量的可选参数。
考虑用一个类表示包装食品外面显示的营养成份标签。这些标签中有几个域是必需的:每份的含量、每罐的含量以及每份的卡路里,还有超过20个可选域:总脂肪量、饱和脂肪量、转化脂肪、胆固醇、钠等等。大多数产品在某几个可选域中都会有非零的值。

1、重叠构造器(不可选)

image.png

想要创建实例的时候
image.png

重叠构造器模式可行,但是有很多参数的时候,客户端代码会很难编写,并且仍然较难以阅读。如果客户端不小心颠倒了其中两个参数的顺序,编译器也不会出错,但是程序在运行时会出现错误的行为。

2、##### javaBean模式(不可选)
遇到许多构造器参数的时候,还有第二种代替办法,即JavaBeans模式,在这种模式下,调用一个无参构造器来创建对象,然后调用setter方法来设置每个必要的参数,及每个相关的可选参数:

image.png

遗憾的是,JavaBeans模式自身有着很严重的缺点。因为构造过程被分到了几个调用中,在构造过程中JavaBean可能处于不一致的状态。类无法仅仅通过检验构造器参数的有效性来呆证一致性。试图使用处于不一致状态的对象,将会导致失败,这种失败与包含错误的代码相径庭,因此它调试起来十分困难。

3、Builder模式(可选)

不直接生成想要的对象,而是让客户端利用所有必要的参数调用构造器(或者静态工厂),得到一个builder对象。然后客户端在builder对象上调用类似于setter的方法,来设置每个相关的可选参数。最后,客户端调用无参的bui尾方法来生成不可变的对象。这个builder是它构建的类的静态成员类(见第22条).下面就是它的示例:


image.png

实例化
**NutritionFacts cocaCola = new NutritionFacts.Builder(240,8).
calories(100).sodium(35).carbohydrate(27).build();

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容