




01
Jolt 大奖神作
《Effective Java》在 2001 年就一举夺得当年度的 Jolt 大奖,这项“软件业界的奥斯卡奖”就是对这本书的价值,以及对作者 Joshua Bloch 超强技术功力的最好肯定。 本书结构独具匠心,一个关键知识点就是一条单独条目,在有些条目内也会交叉引用其他条目的知识,从而缀点成线,形成知识的网络。从第 1 版的 57 个条目扩展到第 2 版的 78 个条目,直至第 3 版达到了 90 条。 这些条目是作者总结出来的特定规则,并精心编写了代码示例,是为了帮助程序员改进程序和设计。所以对于有一些 Java 编程经验,却又不知如何提升代码水准的读者来说,这本书是 Java 编程的最佳实践指导。 相比之前的版本,这一版增加了 Lambda 表达式、流、Optional 类、接口默认方法、try-with-resources、@SafeVarargs 注解、模块等 Java 7 及后续版本所引入的新特性。本书所涉及的特性都可以应用在目前国内主流 Java 环境中。 本书作者 Joshua Bloch 大神,2001 年度 Jolt 大奖得主,美国卡内基-梅隆大学(Carnegie Mellon University,CMU)教授,曾担任Google公司首席 Java 架构师、Sun 公司杰出工程师和 Transarc 公司高级系统设计师。
02
学会这90条规则,成为真正的Java程序员
本书的 90 个条目分布在 11 个主题中,包括创建和销毁对象、类和接口、Lambda 表达式和流等。这些条目讲透了高效使用 Java 编程语言及其基础类库 java.lang、java.util 和 java.io,以及诸如 java.util.concurrent 和 java.util.function 等子包。 读者不用按顺序阅读,可以根据自己的问题查找主题,再对某个条目细读。 当然,如果读者闲暇时间充裕,对这 90 条规则都能学习实践,那么Java 编程功力一定暴涨。 针对上一版本增加的新特性,书中列出了这些主要特性会在哪些条目中讲解,读者可以参考下表。
1. 创建和销毁对象:用静态工厂方法代替构造器;优先考虑通过依赖注入来连接资源;与 try-finally 相比,首选 try-with-resources。
2. 对所有对象都通用的方法:在重写 equals 方法时要遵守通用约定;总是重写 toString 方法。
3. 类和接口:组合优先于继承;与抽象类相比,优先选择接口;为传诸后世而设计接口。
4. 泛型:列表优先于数组;首选泛型方法;使用有限制的通配符增加 API 的灵活性。
5. 枚举和注解:使用 enum 代替 int 常量;使用接口模拟可扩展的枚举。
6. Lambda 表达式和流:与匿名类相比,优先选择 Lambda表达式;首选标准的函数式接口。
7. 方法:检查参数的有效性;仔细设计方法签名;为所有导出的 API 元素编写文档注释。
8. 通用编程:与传统的 for 循环相比,首选 for-each 循环;首选基本类型,而不是其封装类;通过接口来引用对象。
9. 异常:异常机制应该仅用于异常的情况;优先使用标准异常;抛出适合当前抽象的异常。
10. 并发:同步对共享可变数据的访问;与线程相比,首选执行器、任务和流;将线程安全性写在文档中。
11. 序列化:在实现 Serializable 接口时要特别谨慎;考虑使用序列化代理代替序列化实例。
程序员在进行代码设计遇到举棋不定的难题时,就可以直接翻开这本书,找到与问题相关的主题,定能豁然开朗,找到最佳实践方案。
03
结语
《Effective Java 中文版(原书第 3 版)》真的是很值得 Java 程序员 N 刷的经典,本书每个条目都讲述了 Bloch 大神对 Java 的独到见解,阐明了如何编写高效、优雅的程序,并且提供了清晰、易懂的示例代码。 对于书中的代码,有个突出的特点,就是包含了很多用来说明设计模式(Design Pattern)和习惯用法(Idiom)的代码示例。对这些示例,书中还提供了与这一领域的神作《设计模式:可复用面向对象软件的基础》一书的交叉引用。

