在bookauthority官网中,20本最好的Java书里,《Effective Java》排名第二,中文版《Effective Java中文版(原书第3版)》已由人民邮电出版社异步图书全新翻译出版。
这是一本很棒的书,里面包含了大量对程序员有用的实用建议。
本书是Jolt获奖作品Effective Java的第3版,对上一版进行了全面更新,涵盖了从Java 5到Java 9的种种特性,是Java开发人员不可缺少的一本参考书。
本书大部分内容都不是讨论性能的,而是关心如何编写出清晰、正确、可用、健壮、灵活和可维护的程序。包含大量完整的示例代码和透彻的技术分析,通过90条经验法则,探索新的设计模式和语言习惯用法,帮助读者更加有效地使用Java编程语言及其基本类库。
作者约书亚 ·布洛克(Joshua Bloch)是美国卡内基-梅隆大学教授,曾是 Google 公司首席 Java 架构师、Sun 公司杰出工程师和 Transarc 公司高级系统设计师。他带领团队设计和实 现过大量的 Java 平台特性,包括 JDK 5.0 语言增强版和获奖的 Java Collections Framework。 他拥有哥伦比亚大学的计算机科学学士学位和卡内基-梅隆大学的计算机科学博士学位。他 的著作还包括 Java Puzzlers和《Java 并发编程实战》(曾获 Jolt 大奖提名)等。
从《Effective Java中文版》的序中更多的了解本书
如果同事用英语对你说:"Spouse of me this night today manufactures the unusual meal in a home. You will join?"你的脑海中可能会接连闪过 3 个念头:第一,他说的是什么;第二, 英语肯定不是他的母语;第三,他要请我去他家里吃饭。
如果曾经学习过第二门语言,并试过在课外使用这门语言,你就会知道有 3 件事情是必须掌握的:这门语言是如何组织的(语法),如何命名想要谈论的事物(词汇),以及如何以符合习惯且高效的方式来表达日常事物(用法)。课堂上往往只讲前两点, 第三点却很 少涉及。所以当你尽力让别人听懂你的话时,却发现母语人士在强忍着不笑出来。
编程语言也是如此。你需要了解核心语言:它是算法式的、函数式的,还是面向对象的?你需要知道它的词汇:标准类库提供了哪些数据结构、运算和功能?你还需要熟悉如何以符合习惯且高效的方式来组织代码。关于编程语言的图书通常只涉及前两点,或者只 是零星地探讨一些用法。之所以会出现这样的情况,也许是因为与前两点相关的图书写起 来更容易。语法和词汇是语言本身的属性,而语言的使用习惯则是使用这门语言的群体具有的特征。
例如,Java 编程语言是支持单继承的面向对象语言,在方法内支持命令式(面向语句) 的编程风格。Java 类库提供了对图形显示、网络、分布式计算和安全性的支持。但如何将这门语言以更好的方式应用于实践呢?
还有一点,程序与口语中的句子不同,也与大多数图书和杂志不同,它很可能会随着 时间的推移而改变。仅仅编写出可以高效运行并且容易被其他人理解的代码往往还不够, 还必须将代码组织得易于修改。对于某个任务 T,可能有 10 种编写代码的方式。而在这 10 种方法中,可能有 7 种是笨拙、低效或令人费解的。那在剩下的 3 种方法中,对于下一 年度发布的软件版本中的任务 T,哪一种需要的修改最少呢?
有大量的图书可用于学习 Java 语言的语法,包括 Arnold、Gosling 与 Holmes 合著的《Java 编程语言》(The Java Progamming Language ),以及 Gosling、Joy、我还有 Bracha 等人合著 的《Java 语言规范》(The Java Language Specification)。同样,介绍 Java 语言相关的类库 和 API 的书也非常多。
本书将解决你的第三类需求:符合习惯且高效的用法。本书作者约书亚 ·布洛克(Joshua Bloch)在 Sun 公司多年来一直在扩展、实现和使用 Java 编程语言;他也大量阅读过其他 人编写的代码,包括我的。在本书中,他提供了许多很好的建议,而且将其系统性地组织 起来,告诉我们如何组织自己的代码,使其运行良好,使别人容易理解,使未来的修改和 改进不那么让人头疼,甚至使我们的程序变得优雅,令人赏心悦目。
Guy L. Steele Jr. 马萨诸塞州伯灵顿 2001 年 4 月
和小编一起来读一读引言部分,也许你会发现这一直是你寻找的那本书。
本书旨在帮助读者高效使用 Java 编程语言及其基础类库 java.lang、java.util 和 http://java.io,以及诸如 java.util.concurrent 和 java.util.function 等子包。 本书也会不时讨论其他类库。
本书共包含 90 个条目,每个条目都会讨论一条规则。这些规则体现了优秀且有经 验的程序员通常会坚持的一些有益做法。本书将这些条目大致划分为 11 个章节,每个 章节会涉及软件设计的某个具体方面。因此, 不一定需要按部就班地从头到尾阅读,每 个条目基本都是独立的。这些条目之间有很多交叉引用,因此可以轻松地找到自己需要 的内容。
自本书的上一个版本出版以来,Java 平台又增加了很多新特性。本书中的大部分条目 都以某种方式使用了这些特性。表 1-1 列出了这些主要特性会在哪些条目中讲解。
大多数条目都会通过程序示例加以说明。本书有个突出的特点,就是包含了很多用来说明设计模式(Design Pattern)和习惯用法(Idiom)的代码示例。本书还会在适当的地方 提供与这一领域的标准参考文献《设计模式:可复用面向对象软件的基础》(Design Patterns : Elements of Reusable Object-Oriented Software)[Gamma95]一书的交叉引用。
许多条目还会包含一个或多个程序示例,用来说明在实践中应该避免的做法。这类例 子,有时被称为反模式(Antipattern),在注释中会被清楚地标注为"// 不要这样做!"。在 每一种情况下,对应的条目都会解释为什么这样做不好,并提供替代方案。
本书不适合初学者,而是假设读者已经熟悉 Java。如果你还不熟悉,可以考虑选择一 本优秀的 Java 入门书,如彼得 ·塞斯措夫特(Peter Sestoft)的 Java Precisely [Sestoft16]。 本书适合任何有 Java 基本知识的人阅读,同时也能使高级程序员从中得到启发。
本书中的大多数规则都源于几条基本原则。清晰性和简洁性最为重要:组件的行为不能使用户感到意外。组件应该尽可能小,但也不能过小。代码应该被复用,而不是被复制。 组件之间的依赖性应保持在最低限度。错误越早被检测出来越好,最好是在编译时就被发 现并解决。
虽然本书中的规则并不能百分之百适用于任何情况,但它们确实是绝大多数情况下的 最佳编程实践。你并不应该一味遵循这些规则,但是如果偶尔需要打破它们,也一定要有 充分的理由。学习编程的艺术,就像学习其他大多数学科一样,都是先学习规则,然后再 学习何时打破这些规则。
本书的大部分内容并不是讨论性能的,而是关注如何编写出清晰、正确、可用、健壮、 灵活和可维护的程序。如果能够编写出这样的程序,那么要得到所需要的性能,往往也就 比较简单了(条目 67)。有些条目确实讨论了性能问题,有的还提供了性能数据。这些数 据,书中会加上"在我的机器上"这样的字样,因此最多只能将其视作近似值。
有必要介绍一下我的计算机,这是一台有些年头的组装机,CPU 是四核 Intel Core i7-4770K,主频为 3.5GHz,内存是 16GB 的 DDR3-1866 CL9,操作系统是 Microsoft Windows 7 Professional SP1(64 位),运行的 OpenJDK 是 Azul 的 Zulu 9.0.0.15。
在讨论Java 编程语言及其类库的特性时,有时候需要指出具体的发行版本。为方便起见,本书没有使用正式的版本名称,而是选择使用简称。表 1-2列出了正式版本名称和本书所用简称之间的对应关系。
书中的示例相对完整,但是当完整性和可读性不可兼得时,会优先保证可读性。示例 会直接使用 java.util 和 http://java.io 包中的类。要编译这些示例,需要在代码中添加一 行或多行 import 声明,或其他类似的样板代码。异步社区网站提供了每个示例的完整版 本,读者可以直接编译和运行。
在大多数情况下,本书会使用《Java 语言规范:基于 Java SE 8》(The Java Language Specification,Java SE 8 Edition)[JLS]中定义的技术术语。有几个术语值得特别提一下。Java语言支持 4 种类型:接口(包括注解)、类(包括枚举)、数组和基本类型。前 3 种被称为 引用类型(reference type)。类的实例和数组都是对象(object),而基本类型的值不是。类 的成员(member)由其字段(field)、方法(method)、成员类(member class)和成员接 口(member interface)组成。方法的签名(signature)由其名称及其形式参数的类型组成; 签名不包括方法的返回类型。
本书也使用了一些与《Java 语言规范:基于 Java SE 8》不同的术语。例如, 本书会将 继承(inheritance)用作子类化(subclassing)的同义词。本书没有对接口使用继承这一术 语,而是简单地表达为一个类实现(implement)了一个接口,或者一个接口扩展(extend) 了另一个接口。对于没有指定访问级别的情况,本书会使用传统的包私有(package-private) 这个术语,而没有使用技术上更严谨的包访问(package access )[JLS, 6.6.1]。
本书还使用了一些在《Java 语言规范:基于 Java SE 8》中没有定义的术语。术语导出 API(exported API),或者简单地说就是 API,指的是类、接口、构造器、成员以及序列化 形式(serialized form),程序员可以通过它们访问类、接口或者包。 ①使用 API 编写程序的 程序员,称为该 API 的用户(user )。如果某个类的实现中用到了一个 API,则称该类为这 个 API 的客户端(client)。
类、接口、构造器、成员和序列化形式统称为 API 元素(API element)。导出 API 由 所有可在定义这个 API 的包之外访问的 API 元素构成。任何客户端都可以使用这些 API 元 素,而 API 的创建者负责支持它们。并非巧合的是,Javadoc 工具在其默认操作模式下生 成的文档中也会包含这些元素。笼统地讲,一个包的导出 API,是由该包中的每个公有
(public)类或接口中公有的和受保护的(protected)成员及构造器组成的。
Java 9 向 Java 平台引入了模块系统(module system)。如果一个类库使用了模块系统, 其导出 API 就是该类库的模块声明导出的所有包的导出 API 的组合。
经典的Java书。如果您是Java程序员,正在寻求一本好书, 那就考虑这一本吧。