《Effective Java中文版 第2版》读书笔记

2020-05-23  

为什么看这本书?

Java 四大名著之一,Java 之父 James Gosling 推荐的书。说来惭愧,搞 Java 6 年半都没有看过这本书。

前两天研究 Builder 模式解决构造函数参数过多的问题,被一位大佬推荐看一下这本书,于是从网盘里 down 下了这本电子书。

 

书的整体情况

300 页,在计算机类书籍里,算比较薄的。但里面的内容都是一个个经典案例,配了 bad code 与问题的修正。读完本书,大概花了 4-5 个小时。

书提到了这些知识模块:

  • 创建和销毁对象
  • 对象的通用方法
  • 类和接口
  • 泛型
  • 枚举与注解
  • 方法
  • 通用程序设计
  • 异常
  • 并发
  • 序列化

各模块里的案例比较零散,但都是精华,能够看出都是作者结合多年编程经验输出的真知灼见。

 

适合阅读人群

这本书不适合初级入门的朋友看,我在早期翻过这本书和《Java编程思想》,基本看不懂,吸收不了书里的精华。感觉就像一位高人在指点你,可你只能傻眼看着他,无法体会他话语中的精髓。

有一定开发经验的 Java coder,看了应该会有所收获。

 

最大的感触

再读本书,觉得这次看懂、吸收了不少精华内容:

  • 使用 Builder 模式解决构造方法参数太多的情况。
  • 写了一定时间的代码,就会思考性能问题,没有必要的对象可以不创建,比如使用享元模式缓存经常使用的不可变对象。
  • 覆盖 Object 类的 equals、hashCode、clone 方法,需要注意很多约束条件。如覆盖 equals 方法总要覆盖 hashCode 方法,否则该对象作为集合类的元素时会出现意想不到的情况,因为有些集合在判断元素是否存在方法内调用了 equals 和 hashCode 方法。
  • 抽象类一般用来表示 is-a 的关系,接口用了表示 has-a 的关系。接口可以用来表示实现类具有某类能力,可以用来进行标注,也可以用来构造组合关系。接口一般优于抽象类。
  • JDK 集合工具包中,泛型的使用是最多的。书中提到了 ?、T、E、?extends、?super,这些表示泛型的通配符,开发中经常遇到。泛型的递归,解惑了我对泛型中嵌套泛型情况的一些疑惑。数组泛型与集合泛型,是存在差异的,如 ArrayList 的泛型就是基于 Object[] 数组存储元素,通过 @SuppressWarnings("unchecked") 注解进行的类型转换,有兴趣可以看下 ArrayList 源码的 get 方法。
  • 枚举也有一些很巧妙的使用方法,比如给枚举添加成员属性,添加构造方法和抽象方法、实现接口,都会给开发带了很多便捷。
  • 异常不要用来处理正常逻辑,异常的处理对性能的消耗较大。比如用抛出异常的方式来停止循环,外层加一个 try-catch 语句,catch 里啥也不做。
  • 并发的最佳实践,没啥说的,去看《Java Concurrency in Practice》。
  • 序列化可以通过造假字节码,在反序列化之后,篡改了原 Java 对象,造成了安全问题。

 

ConstXiong 备案号:苏ICP备16009629号-3