杰瑞科技汇

Effective Java 中文版有哪些核心要点?

这本书是 Java 界公认的“圣经”级著作,由 Joshua Bloch(前 Google 首席 Java 架构师,也是 Java Collections Framework 和 java.lang 包的许多关键类的设计者)编写,它不是一本入门教程,而是一本专注于提升 Java 程序员内功和代码质量的最佳实践指南。

Effective Java 中文版有哪些核心要点?-图1
(图片来源网络,侵删)

核心思想

这本书的核心思想是:编写高质量、高性能、可维护、可测试的 Java 代码,它通过一系列独立的条目,告诉你“应该怎么做”以及“为什么应该这么做”,帮助你规避语言陷阱,利用好 Java 的各种特性。


中文版资源

目前市面上有几个主流的《Effective Java》中文版,内容大同小异,翻译质量略有差异:

  1. 《Effective Java(第3版)》 - 这是最新的版本,基于 Java 9、10、11 和 12 的新特性进行了全面更新。强烈推荐阅读这一版,因为它涵盖了现代 Java 的重要特性,如 var、模块系统、不可的集合等。

    • 译者丁从悦,他的翻译被广泛认为是目前最好的版本之一,术语准确,行文流畅,可读性非常高。
    • 出版社:机械工业出版社
  2. 《Effective Java(第2版)》 - 这是一个经典版本,基于 Java 5 和 6,虽然内容稍显过时,但其核心思想(如创建和销毁对象、类和接口、通用程序设计等)至今仍然非常重要,对于初学者来说,第2版也是一个不错的选择,因为它讲解的很多基础概念是永恒的。

    Effective Java 中文版有哪些核心要点?-图2
    (图片来源网络,侵删)
    • 译者杨春花 等人,这个版本也流传很广。

如何选择?

  • 如果你是新手:可以从第2版开始,打好基础,然后再升级到第3版。
  • 如果你有一定经验直接从第3版开始,这是最与时俱进的版本。

概览(以第3版为例)

第3版共包含 90 个条目,分为 11 个章节,覆盖了 Java 编程的方方面面。

第1章:创建和销毁对象

这是本书最经典、最核心的章节之一。

  • 条目 1:考虑用静态工厂方法代替构造器:介绍如何创建更灵活、更易用的对象创建方式(如 Boolean.valueOf())。
  • 条目 2:遇到多个构造器参数时考虑使用构建器:解决“构造器模式”(Telescoping Constructor Pattern)的臃肿问题,推荐使用构建器模式,特别是对于有很多可选参数的类。
  • 条目 3:用私有构造器或者枚举类型强化 Singleton 属性:保证一个类只有一个实例,并防止被实例化。
  • 条目 4:通过私有构造器强化不可实例化的能力:介绍如何创建一个只包含静态工具方法的工具类,并防止被错误地实例化。
  • 条目 5:优先依赖注入而不是硬编码资源:让组件的依赖关系更灵活,提高可测试性。
  • 条目 6:避免创建不必要的对象:强调对象重用,特别是对于不可变对象,性能更优。
  • 条目 7:消除过期的对象引用:防止内存泄漏,特别是集合和缓存。
  • 条目 8:避免使用终结方法和清除方法:解释了 finalizer 的不可靠性和性能问题,并推荐使用 try-with-resourcesCleaner 作为替代方案。

第2章:对于所有对象都通用的方法

  • 条目 10:始终重写 toString:让你的对象在调试和日志输出时更有用。
  • 条目 11:谨慎地重写 equals 方法:讲解了 equals 方法的通用约定(自反性、对称性、传递性、一致性、非空性),以及如何正确实现它。
  • 条目 12:始终重写 hashCode 方法:当你重写 equals 时,必须重写 hashCode,否则无法在哈希表中正常工作(如 HashMap, HashSet)。
  • 条目 15:使可变性最小化:强烈推荐使用不可变类,它们更简单、更安全、更易于使用。
  • 条目 16:复合优先于继承:继承会破坏封装,而组合(Composite)是一种更灵活、更安全的复用代码的方式。

第3章:通用程序设计

  • 条目 34:用 instanceof 进行类型检查,而不是 getClass:在重写 equals 时,如何正确地处理子类比较问题。
  • 条目 43:返回零长度的数组或集合,而不是 null:可以避免调用方进行 null 检查,使代码更健壮。

第4章:类和接口

  • 条目 15:使可变性最小化(再次强调,这是非常重要的原则)。
  • 条目 16:复合优先于继承(再次强调)。
  • 条目 17:要么为继承而设计,并提供文档说明,要么就禁止继承:如果你要让一个类可以被继承,就必须仔细考虑其所有细节。
  • 条目 18:接口优于抽象类:接口可以更好地支持多重继承,更灵活。
  • 条目 19:接口只用于定义类型:不要用接口来定义常量。
  • 条目 20:类层次优于标签类:避免使用带有 typetag 字段的类,应该使用子类来表示不同的类型。

第5章:泛型

这是 Java 5 引入的重要特性,也是最容易让人困惑的地方,本章是理解泛型的必读章节。

  • 条目 23:不要在新代码中使用原生态类型:解释为什么 List 是危险的,应该始终使用 List<String> 这样的参数化类型。
  • 条目 25:优先使用泛型:让你的类和方法都变得泛型化,以获得编译时的类型安全检查。
  • 条目 26:确保在循环中使用了正确的变量类型for-each 循环与泛型结合使用时的注意事项。
  • 条目 29:优先考虑泛型方法:编写不依赖于特定类的泛型方法。

第6章:枚举和注解

  • 条目 34:使用 Enum 代替 int 常量Enum 类型更安全、更强大。
  • 条目 35:用实例域代替序数:不要使用 Enum.ordinal() 来获取索引,应该定义一个实例域来存储它。
  • 条目 39:坚持使用 Annotation 的惯例:如何正确地使用注解。

第7章:Lambda 和 Stream

这是 Java 8 引入的革命性特性。

  • 条目 43:优先使用 lambda 表达式而不是匿名类:让代码更简洁。
  • 条目 45:谨慎使用 Stream:Stream 非常强大,但滥用会导致代码难以理解和调试。
  • 条目 46:优先使用无干扰的 Stream:解释 filter, map, forEach 等无干扰操作的好处。
  • 条目 47:Stream 要优先用 collect 而不是 forEachcollect 是更灵活、更强大的归约操作。

第8章:方法

  • 条目 53:谨慎地使用变长方法:了解 varargs 的优缺点。
  • 条目 59:谨慎地返回 OptionalOptional 是一个很好的 null 替代品,但不要在集合或数组上使用它。
  • 条目 60:为所有导出的 API 元素编写文档注释:使用 Javadoc 规范地编写文档。

第9章:通用编程

  • 条目 69:优先使用基本类型而不是装箱基本类型:装箱类型(如 Integer)有性能开销和 null 问题。
  • 条目 70:如果其他类型更适合,则避免使用字符串:不要用字符串来表示类型、状态等。
  • 条目 71:谨慎地依赖字符串的连接性能:在循环中,使用 StringBuilder 代替 连接。

第10章:异常

  • 条目 73:将受检异常的使用限制在条件 true 的情况下:不要过度使用受检异常。
  • 条目 74:对可恢复的条件使用受检异常,对编程错误使用运行时异常:明确两种异常的用途。
  • 条目 75:避免不必要地使用受检异常:返回一个 Optional 或一个特殊值比抛出异常更好。

第11章:并发

  • 条目 78:同步访问可变共享数据:并发编程的核心原则。
  • 条目 79:避免过度同步:过度同步会降低性能,并可能导致死锁。
  • 条目 84:ExecutorTask 优先于 Thread:使用线程池(ExecutorService)来管理线程。
  • 条目 90:优先使用并发工具而不是 waitnotify:介绍 java.util.concurrent 包中的高级并发工具,如 CountDownLatch, Semaphore, ConcurrentHashMap 等。

如何有效阅读这本书?

  1. 不要从头到尾“读”:这本书不是一本小说,它更像一本字典或工具手册,可以挑选你感兴趣的章节或条目开始阅读。
  2. 带着问题去读:在日常编程中,如果你遇到了某个问题(我该如何设计一个配置类?”),可以翻到相关的章节(如“创建和销毁对象”),看看大师是如何建议的。
  3. 精读,并动手实践:对于每一个条目,不仅要理解“是什么”,更要理解“为什么”,尝试在你的项目中应用这些实践,你会发现代码质量确实在提升。
  4. 反复阅读:随着你编程经验的增长,每次重读这本书都会有新的收获,很多初读时觉得深奥的概念,在有了实践经验后会豁然开朗。

《Effective Java 中文版》(尤其是第3版)是每一位 Java 程序员,无论初级还是资深,都应该放在案头反复研读的经典之作,它不仅仅告诉你如何写代码,更重要的是培养你一种“Java 思维”,让你写出更专业、更优雅、更健壮的 Java 程序。

分享:
扫描分享到社交APP
上一篇
下一篇