effective java(第三版)---读书笔记

第一章 引言

 

《 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内部增加相应的函数即可,扩展性非常好,而且非常易读,且安全。
 

posted @ 2019-07-16 02:05  lyrichu  阅读(1585)  评论(0编辑  收藏  举报