关键词:
静态工厂和构造器有个共同的局限性:它们都不能很好地扩展到大量的可选参数。
当一个类中有若干个必选属性和多个可选属性时,采用重叠构造器模式、JavaBeans模式或者Builder模式,但各有优劣。
当有很多参数的时候,重叠构造器模式下客户端代码会很难编写,并且仍然较难以阅读。
JavaBeans模式调用一个无参构造器来创建对象,然后调用setter方法来设置每个必要的参数,以及每个相关的可选参数。因为构造过程被分到了几个调用中,在构造过程中JavaBean可能处于不一致的状态。与此相关的另一点不足在于,JavaBeans模式阻止了把类做成不可变的可能。
Builder模式不直接生成想要的对象,而是让客户端利用所有必要的参数调用构造器(或者静态工厂),得到一个builder对象,然后客户端在builder对象上调用类似于setter的方法,来设置每个相关的可选参数,客户端最后调用无参的build方法来生成不可变的对象。这个builder是它构建的类的静态成员类。
下面就是它的示例:
1 public class NutritionFacts { 2 private final int servingSize; 3 private final int servings; 4 private final int calories; 5 private final int fat; 6 private final int sodium; 7 private final int carbohydrate; 8 9 public static class Builder { 10 // Required parameters 11 private final int servingSize; 12 private final int servings; 13 14 // Optional parameters - initialized to default values 15 private int calories = 0; 16 private int fat = 0; 17 private int carbohydrate = 0; 18 private int sodium = 0; 19 20 public Builder(int servingSize, int servings) { 21 this.servingSize = servingSize; 22 this.servings = servings; 23 } 24 25 public Builder calories(int val) { 26 calories = val; 27 return this; 28 } 29 public Builder fat(int val) { 30 fat = val; 31 return this; 32 } 33 public Builder carbohydrate(int val) { 34 carbohydrate = val; 35 return this; 36 } 37 public Builder sodium(int val) { 38 sodium = val; 39 return this; 40 } 41 42 public NutritionFacts build() { 43 return new NutritionFacts(this); 44 } 45 } 46 47 private NutritionFacts(Builder builder) { 48 servingSize = builder.servingSize; 49 servings = builder.servings; 50 calories = builder.calories; 51 fat = builder.fat; 52 sodium = builder.sodium; 53 carbohydrate = builder.carbohydrate; 54 } 55 56 public static void main(String[] args) { 57 NutritionFacts cocaCola = new NutritionFacts.Builder(240, 8). 58 calories(100).sodium(35).carbohydrate(27).build(); 59 } 60 }
它在检验约束时将参数从builder拷贝到对象中之后,并在对象域而不是builder域中对它们进行检验。如果违反了任何约束条件,build方法就应该抛出IllegalArgumentException。对多个参数强加约束条件的另一个方法是,用多个setter方法对某个约束条件必须持有的所有参数进行检查。一旦传递了无效的参数,立即就会发现约束条件失败,而不是等着调用build方法。与构造器相比,builder的微略优势在于,builder可以有多个可变参数。构造器就像方法一样,只能有一个可变参数。
Java中传统的抽象工厂实现是Class对象,newInstance方法总是企图调用类的无参构造器,这个构造器甚至可能根本不存在。Class.newInstance破坏了编译时的异常检查。Builder模式也存在不足。为了创建对象,必须先创建它的构建器。在十分注重性能的情况下,可能就成问题了。Builder模式还比重叠构造器模式更加冗长,因此它只在有很多参数的时候才使用,比如4个或者更多个参数。通常最好一开始就使用构建器。
如果类的构造器或者静态工厂中具有多个参数,设计这种类时,Builder模式就是种不错的选择,特别是当大多数参数都是可选的时候。与使用传统的重叠构造器模式相比,使用Builder模式的客户端代码将更易于阅读和编写,构建器也比JavaBeans更加安全。
参考资料
《Effective Java 中文版 第2版》 P9-13
effectivejava中文版(第2版)pdf分享下载
链接:https://pan.baidu.com/s/1gvh451oxqasq5fsbupX2Sw提取码:pjxj 简介:本书介绍了在java编程中78条极具实用价值的经验规则,这些经验规则涵盖了大多数开发人员每天所面临的问题的解决方案。通过对java平台设计专家所使用的技术... 查看详情
《effectivejava》中文第2版note(代码片段)
第15条[66]: 为不可变类提供静态工厂,eg:Integer/BigInteger使用了静态工厂缓存了一些常用的实例,通常Integer-128~+127. BigInteger-16~+16。通过更改JVM参数可以改变Integer缓存的范围。在Idea中打开Run/DebugConfigurations在下入红框处输入-X... 查看详情
java《effectivejava中文版第2版》学习笔记遇到多个构造器时要考虑用构建器
静态工厂和构造器有个共同的局限性:它们都不能很好地扩展到大量的可选参数。 当一个类中有若干个必选属性和多个可选属性时,采用重叠构造器模式、JavaBeans模式或者Builder模式,但各有优劣。 当有很多参数的... 查看详情
effectivejava第三版——48.谨慎使用流并行
Tips《EffectiveJava,ThirdEdition》一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将近8年的时间,但随着Java6,7,8,甚至9的发布,Java语言发生了深刻的变化。在这... 查看详情
《effectivejava(中文第二版)》pdf下载
《EffectiveJava(中文第二版)》【PDF】下载链接:https://u253469.pipipan.com/fs/253469-230382186 Java(中文第二版)》【PDF】" TITLE="《EffectiveJava(中文第二版)》【P 查看详情
effectivejava第三版——46.优先考虑流中无副作用的函数
Tips《EffectiveJava,ThirdEdition》一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将近8年的时间,但随着Java6,7,8,甚至9的发布,Java语言发生了深刻的变化。在这... 查看详情
effectivejava第三版——47.优先使用collection而不是stream来作为方法的返回类型
Tips《EffectiveJava,ThirdEdition》一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将近8年的时间,但随着Java6,7,8,甚至9的发布,Java语言发生了深刻的变化。在这... 查看详情
java零基础入门书籍都有哪些值得推荐?
...细致,可以说是一部有关Java的百科全书。四大名著之《EffectiveJava中文版(第2版)》“神书”、“整本书都是精华”、“内容永不过时”、“Java程序员必读”……这些标签都是属于《EffectiveJava中文版》的。这本书不是讲理论基础... 查看详情
effectivejava英文第二版读书笔记item11:overrideclonejudiciously
x.clone()!=xwillbetruex.clone().getClass()==x.getClass()willbetruex.clone().equals(x)alwaystrue.意味着深复制,新建对象,数据与结构与原对象一致,Copyinganobjectwilltypicallyentailcreatinganewinstanceoftisclass,butitmayrequire 查看详情
一文读懂《effectivejava》第42条:慎用可变参数
在Java1.5发行版中,加入了可变参数列表方法,称为variablearitymethod(可匹配不同长度的变量的方法)。可变参数机制:通过创建一个数组,数组的大小为在调用位置所传递的参数数量,然后将参数值传到数组中,最后将数组传递... 查看详情
java学习书籍推荐
...:C语言描述》《算法图解》《算法第四版》2.Java相关《Effectivejava》《HeadFirstJava.第二版》《JAVA网络编程第4版》3.JavaWeb相关《深入分析JavaWeb技术内幕》《Spring实战(第4版)》《Redis实战》《Redis设计与实现》《深入剖析Tomcat》《... 查看详情
我的2017年书单
...45个习惯》《破茧成蝶:用户体验设计师的成长之路》《EffectiveJava中文版》(第2版) 查看详情
effectivejava第十章并发
EFFECTIVE JAVA 第十章 并发 66.同步访问共享的可变数据 *java语言规范保证读或写一个变量是原子的(可以保证返回的值是某个线程保存在该变量中的),除非这个变量的类型为long或double。(但并不保证一个... 查看详情
html5与css3权威指南(第2版·上册)中文pdf扫描版?
HTML5与CSS3权威指南(第2版·上册)已经成为HTML 5与CSS 3图书领域的一个标杆,被读者誉为“系统学习HTML 5与CSS 3技术的最佳指导参考书之一”和“Web前端工程师案头必备图书之一”。第2版首先从技术的角度结合最新的... 查看详情
矩阵分析(中文版+英文版.第2版)-[美]rogera.horn
矩阵分析(中文版+英文版.第2版)-[美]RogerA.Horn华章数学译丛52,中文版,2014年的版本英文版剑桥大学出版社2012年出版,共2本书链接:https://pan.baidu.com/s/1QHFnkGY5L3RoU7URzoGPmg如下: 查看详情
html5与css3实例教程(第2版)附源码中文pdf扫描版
HTML5和CSS3技术是目前整个网页的基础。《HTML5与CSS3实例教程(第2版)》共分3部分,集中讨论了HTML5和CSS3规范及其技术的使用方法。这一版全面讲解了最新的HTML5和CSS3技术,所有实例均使用最新特性实现,针对的是最新版本的浏览... 查看详情
java编程思想第4版清晰中文版网盘下载
下载地址:https://u18103887.ctfile.com/fs/18103887-314580535java编程思想第4版清晰中文版网盘下载 查看详情
javascript权威指南(第6版)(中文版)pdf
下载地址:网盘下载 内容简介编辑第5版针对Ajax和Web2.0技术进行了全新的改版。和上一版相比,更新的内容较多,总体上接近整个篇幅的1/2,而这也正是本书姗姗来迟的原因之一。具体来说,第5版在以下部分有所更新:... 查看详情