第一章 引言

《 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. Oracle 后台进程(五)SMON进程

    转载自:刘相兵 Maclean Liu 文章 你所不知道的后台进程 SMON 功能   SMON(system monitor process)系统监控后台进程,有时候也被叫做 system clea ...

  2. BSGS ! x

    一.引入: 若存在一个式子a^b ≡ c (mod p) (p ≡ 1000000007,且0<a,b,c<p) 已知a,b,求c.  这不就是快速幂嘛! 已知a,c,求b. 这就是我们需 ...

  3. 牛客练习赛55 E-树 树形DP

    题意 你有一颗大小为\(n\)的树,点从\(1\)到\(n\)标号. 设\(dis⁡(x,y)\)表示\(x\)到\(y\)的距离. 求\(\sum_{i=1}^{n}\sum_{j=1}^{n}di ...

  4. c#简单的SQLHelp

    public abstract class SQLHelper { //只读的静态数据库连接字符串 //需添加引用System.Configuration; public static readonl ...

  5. MySQL基础之二:主从复制

    # mysql主从复制逻辑: 1.从库执行start slave 开启主从复制. 2.从库请求连接到主库,并且指定binlog文件以及位置后发出请求. 3.主库收到从库请求后,将信息返回给从库,除了信 ...

  6. Java学习日记——基础篇(一)常识

    JAVA简介 Java的标准 Java是一种语言,一个平台包含JavaSE.JavaEE.JavaME三个版本 JavaSE标准版(属于Java的基础部分,可以开发C/S构架的桌面应用程序) Java ...

  7. 异步机制 - BindIoCompletionCallback

    直接上代码 VOID CALLBACK test_io_completion_routine( DWORD dwErrorCode, DWORD dwNumberOfBytesTransfered, ...

  8. 学号20175313 《实现Linux下Sort -t : -k 2功能》第十二周

    目录 一.题目要求 二.题目理解 三.设计思路 四.代码实现 五.代码链接 六.运行结果截图 七.参考资料 一.题目要求 实现Linux下Sort -t : -k 2的功能 二.题目理解 -t 分隔符 ...

  9. Node.js中npm常用命令大全

    npm是什么 NPM的全称是Node Package Manager,是随同NodeJS一起安装的包管理和分发工具,它很方便让JavaScript开发者下载.安装.上传以及管理已经安装的包. npm ...

  10. Mac OS 下三种修改Hosts文件的方法

    一.系统偏好设置修改 1.打开系统偏好设置,底部有一个Hosts的快捷入口2.输入ip和hostname后,回车确定,勾选改host即可   二.终端命令行修改 sudo vi /etc/hosts ...