第一章 引言

《 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. 直接插入排序Straight_Insertion_Sort

    基本思想:简单排序的一种.如果玩过扑克牌应该都知道顺子,这时有一把顺子但是顺序是乱的,你要去按顺序整理.那第二张牌和第一张牌比较,调整顺序后前两张牌就是有序的,接着第三张牌插入前两张的有序列中,形成三 ...

  2. linux实操_shell

    简单shell编写: 执行方式: (1)推荐 (2)不推荐

  3. 自己编写jQuery插件之表单验证

    自己编写jQuery插件之表单验证 吐个嘈先:最近状态不咋滴,真是什么都不想干,不想上班,做什么都没动力,觉得没意思.不想这样,不想这样,快让这种情绪消失吧,忽忽.... 表单验证在项目中用的还是比较 ...

  4. 3、获取Class对象的三种方式

    3.获取Class对象的三种方式 要想对字节码文件进行解刨,必须要有字节码文件对象 Object类中的getClass方法 通过对象静态属性 .class来获取对应的Class对象 只要通过给定类的字 ...

  5. Oracle 物理结构(一) 文件-Inventory

    一.Inventory的定义与作用 oraInventory存放的是Oracle软件安装的目录信息,Oralce的安装升级都需要用到这个目录,来看看Oracle文档中对这个目录的一点说明:All Or ...

  6. ue/um-editor实现word图片复制

    图片的复制无非有两种方法,一种是图片直接上传到服务器,另外一种转换成二进制流的base64码 目前限chrome浏览器使用,但是项目要求需要支持所有的浏览器,包括Windows和macOS系统.没有办 ...

  7. axios 设置接口retry次数与间隔时间

    /设置全局的请求次数,请求的间隙 axios.defaults.retry = 3; axios.defaults.retryDelay = 2000; axios.interceptors.resp ...

  8. webpack+vue+Eslint+husky+lint-staged 统一项目编码规范

    一. Eslint: 为什么我们要在项目中使用ESLint ESLint可以校验我们写的代码,给代码定义一个规范,项目里的代码必须按照这个规范写. 加入ESLint有非常多的好处,比如说可以帮助我们避 ...

  9. leetcode解题报告(6):Remove Duplicates from Sorted List

    描述 Given a sorted linked list, delete all duplicates such that each element appear only once. For ex ...

  10. devstack cinder-volume服务状态为down

    cinder-manage service list 查看到有一个 xxx状态 Binary Host Zone Status State Updated At RPC Version Object ...