为什么看这本书?
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 对象,造成了安全问题。