java《effectivejava中文版第2版》学习笔记遇到多个构造器时要考虑用构建器

王景迁 王景迁     2022-09-21     234

关键词:

  静态工厂和构造器有个共同的局限性:它们都不能很好地扩展到大量的可选参数。

  当一个类中有若干个必选属性和多个可选属性时,采用重叠构造器模式、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版在以下部分有所更新:... 查看详情