第一章 引言

《 Effective Java》这本书并不厚,而且并不适合初学者,适合有一定的工作经验的java攻城狮。这本书不是百科全书式的JAVA 手册,而是试图在讲述如何正确、高效地使用java这门语言来完成日常的开发工作。
如今(2019)java已经诞生了24个年头,在这些年里,java被广泛应用在许多领域,并且开发者、类库以及生态环境也在不断壮大。这本书的作者是一名知名的java专家,曾在sun公司以及google任职,领导开发了很多专业的java类库。
本书的第一版诞生于2001年,那个时候java这门语言才刚刚诞生不久。本书的第二版则诞生于2008年,那个时候java5/6刚刚诞生,引入了很多新的特性,比如泛型、for-each循环等,本书的第三版则诞生于2017年,与时俱进地增加了很多新内容,特别是关于java7/8/9的新特性,比如lambda表达式,optional,stream,module等。而且作者列出的建议条目也从原来的70多个增加到90个,同时也删改了一些过时的内容。
总体来说,这仍然是java程序员案头必备的一本JAVA最佳实践参考书,值得经常拿出来翻一番,对于提高编码的思想与技术一定会大有裨益。

第二章 创建和销毁对象

建议1:使用静态工厂函数替代公有的构造器。
公有的构造器的主要缺点是:一般只能有一个共有的构造函数,如果想有多个构造函数,就要传入不同数量的参数。但是这种情况下的多个构造器容易语义不明,让调用者感到困惑。
静态工厂方法有以下几个好处:
  • 有名称,数量没有限制,易于阅读。
  • 方便构建一个singleton,节约创建对象的开销。
  • 可以返回原类型的任何类型的子类型对象。
  • 返回的对象可以随着每次调用而发生变化,这取决于静态工厂方法的参数值。
  • (hard) 方法返回对象所属的类,在编写包含该静态工厂方法的类时可以不存在。
静态工厂方法的主要缺点:
  • 如果类不包含公有的或者受保护的构造器,那么就无法被子类化。但是这么做也许会带来额外的好处,那就是
鼓励多用复合而不是继承。
  • 程序员比较难以发现这些静态工厂函数,但是这点一般可以通过标准注释以及习惯命名来解决,静态工厂函数一般有如下的习惯名称:
from
valueof
instance / getInstance
create / newInstance
getType
newType
type
 
建议2:遇到很多个构造器参数时,要考虑使用构建器(builder)
比如一个类有10个field,而且有着不同个数参数的初始化方式,比如有的时候需要传递3个参数,而有的时候则需要传递10个参数。一般的做法是,分别写有不同个数的构造器,然后按照需求调用。但是这种方式往往很难搞懂到底该怎么传参数,因为没有名称,而且如果两个类型相同但是顺序不同的参数放到一起,传入顺序如果搞反了,这种错误是很难及时发现的。
所以为了解决这个问题,一般可以使用JavaBean 模式,也就是编写很多setXXX方法,分别用于传递不同的参数,这种方法的好处是传参清晰易懂,但是有一个致命的缺点,那就是构造的过程中,类可能处于不一致的状态,而且也没有办法验证构造器参数的有效性(可能遗漏了某个set方法)。
这种情况下的最佳解决办法,是使用构建器,即builder 模式。主要的方法是创建一个静态公有内部类Builder,其field 与原始类的field保持一致,如果是必传参数,则是 final类型,而且提供一个共有的Builder构造函数来传入这些必传参数,然后可选参数则通过一系列返回值是Builder对象本身的函数来实现,这样可以实现流式调用。最后提供一个build函数来返回构造好的原对象,提供一个私有的,传入参数为 Builder对象的原始类构造函数,来实现build 函数。
总体上来说,builder模式在有很多个构造器参数时,既可以让传入的参数具名,又可以避免遗漏某个传入参数导致构造对象不一致的情况发生(可以在Builder内部检查传入参数的有效性)。
但是builder模式也有其缺陷:
  • 为了创建对象,必须要创建其构造器,等于要创建两个对象,这在对性能有严格要求的场景下可能会有问题,不过大部分情况下可以忽略不计。
  • builder 模式写起来比较麻烦、冗长。
但是其优点也是显著的,一旦一开始使用builder模式,当后面需要扩展参数时,非常方便,只需要在Builder内部增加相应的函数即可,扩展性非常好,而且非常易读,且安全。
 


effective java(第三版)---读书笔记的更多相关文章

  1. effective Java 第三版学习笔记

    创建对象类型的 1,静态工厂方法代替构造器 静态工厂方法有名称,不容易混乱他的作用 不必再每次调用他的时候创建实例,创建实例的代价是高的,可以重复利用缓存的对象 静态工厂甚至能返回子类对象,例如在接口 ...

  2. Linux设备驱动程序 第三版 读书笔记(一)

    Linux设备驱动程序 第三版 读书笔记(一) Bob Zhang 2017.08.25 编写基本的Hello World模块 #include <linux/init.h> #inclu ...

  3. 《Effective Java 第三版》新条目介绍

    版权声明:本文为博主原创文章,可以随意转载,不过请加上原文链接. https://blog.csdn.net/u014717036/article/details/80588806前言 从去年的3月份 ...

  4. Effective Java 第三版笔记(目录)

    <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将近8年的时 ...

  5. Effective Java 第三版——1. 考虑使用静态工厂方法替代构造方法

    Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ...

  6. Effective Java 第三版——3. 使用私有构造方法或枚类实现Singleton属性

    Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ...

  7. Effective Java 第三版——7. 消除过期的对象引用

    Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ...

  8. Effective Java 第三版——9. 使用try-with-resources语句替代try-finally语句

    Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ...

  9. Effective Java 第三版——10. 重写equals方法时遵守通用约定

    Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ...

随机推荐

  1. stm32如何核对flash大小和sram大小

    以stm32f103zet6为例,直接上图:

  2. 2019牛客多校E Androgynos——自补图&&构造

    题目 给出一个 $n$,判断是否存在 $n$ 个顶点的自补图,如果存在,输出边和映射. 分析 一个无向图若同构于它的补图,则称该图为自补图. 定理:一个自补图一定存在 $4k$ 或 $4k+1$ 个顶 ...

  3. C# 未能加载项目文件

    在使用VS打开从网上下载或者从其他地方复制得来的解决方案时,经常会出现这样一个错误,"在解决方案中的一个或多个项目由于以下原因未能加载项目文件或网站已移动或已重命名,或者不在您的计算机上.& ...

  4. 富文本编辑器直接从 word 中复制粘贴公式

    在之前在工作中遇到在富文本编辑器中粘贴图片不能展示的问题,于是各种网上扒拉,终于找到解决方案,在这里感谢一下知乎中众大神以及TheViper. 通过知乎提供的思路找到粘贴的原理,通过TheViper找 ...

  5. [POI2008]BLO-Blockade 割点

    [POI2008]BLO-Blockade 割点 题面 容易想到用\(\text{Tarjan}\)求割点.对于非割点,会损失\(2\times(n-1)\)次访问(注意是互相访问,所以要乘2):对于 ...

  6. [HNOI2008] 越狱 快速幂

    [HNOI2008] 越狱 快速幂 水.考虑不发生越狱的情况:即宗教相同的都不相邻,一号任意放\(m\)种宗教的人,此后\(n-1\)个房间都放与上一个宗教不同的人,有\(m-1\)种,所以共有\(m ...

  7. python爬虫demo01

    python爬虫demo01 1 import requests, json, time, sys 2 from bs4 import BeautifulSoup 3 from contextlib ...

  8. 带下划线的 HTTP Header无法获取到可能是因为nginx

    背景:新版本修改了个功能是在老版本的基础上做的,同一个接口,需要兼容老版本,因此让前台在header中封装了 version版本号,client_type 客户端类型,根据这两个字段判断接口要走的逻辑 ...

  9. IdentityServer4入门二

    在 IdentityServer4入门一 我们准备好了一个认证的服务端,这里做一个需要保护的API服务 首先,向解决方案新增一个项目.我们同样使用入门一的方式新增一个asp.net core Web程 ...

  10. JSON字符串控制台格式化输出 java

    1.正常情况下返回的json数据格式如下: {"header":{"transSn":"e33128bb7622462ebfb2cbfcc46baa1 ...