第一章 引言

《 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. .Net优秀应用界面大PK!DevExpress年度大赛,群雄逐鹿花落谁家

    DevExpress 优秀界面图片火热征集中! 只要您晒出来,慧都就为您颁奖! 角逐前三,百度AI音箱.小米行李箱等惊喜大礼等您Pick! 活动时间:12月1日-12月31日 立即参与 活动详情 活动 ...

  2. java后台表单字符串长度验证

    1.方法封装前提实体类属性去除首尾空白并进行反转义 //实体类属性的get方法 public String getContent() { if(!"".equals(字符串属性名) ...

  3. python查看文件夹下所有文件

    实现查看所有文件,重点在于文件夹下又有文件夹时怎样处理,这里通过os模块来解决. 方法一 : 通过递归实现遍历所有文件夹 import os def func(path): for i in os.l ...

  4. MySQL分组排序(取第一或最后)

    MySQL分组排序(取第一或最后) 方法一:速度非常慢,跑了30分钟 SELECT custid, apply_date, rejectrule FROM ( SELECT *, IF ( , ) A ...

  5. pyecharts 开发文档

    pyechart 新 版本 https://pyecharts.org/#/zh-cn/quickstart pyecharts 老版本 https://05x-docs.pyecharts.org/ ...

  6. sublime text 3 3126注册码

    —– BEGIN LICENSE —– Michael Barnes Single User License EA7E-821385 8A353C41 872A0D5C DF9B2950 AFF6F6 ...

  7. 深入理解D3D9

    本文写的较为深入,故转载在此留以备案,呵呵~ 原文链接为:http://www.cnblogs.com/effulgent/archive/2009/02/10/1387438.html ------ ...

  8. ie8 ajax 跨域问题

    最近做了个客服端要通过ocx获得初始化数据就是一个html页面镶嵌在一个c++做的程序里面通过c++做的程序的一个按钮来打开我的这个html页面但是页面中的ajax就是用不了又不报错 后来加入了cro ...

  9. Golang文件操作整理

    基本操作 文件创建 创建文件的时候,一定要注意权限问题,一般默认的文件权限是 0666 关于权限的相关内容,具体可以参考鸟叔p141 这里还是再回顾下,文件属性 r w x r w x r w x,第 ...

  10. navicat连接远程数据库报错'client does not support authentication protocol requested by server consider ...'解决方案

    [1.cmd终端连接远程mysql数据库方法] mysql -uhello -pworld   -h192.168.1.88 -P3306 -Dmysql_oa mysql -u用户名 -p密码 -h ...