Effective Java Item0 引言

这本书的目的是帮助你高效地使用java这门编程语言和它的基本类库:java.lang , java.util, and java.io
和这些包子包下的:java.util.concurrent 和java.util.function 。其它的类库也会时不时地被讨论到。

这本书有90个小项,每一项都表达了一个准则。这些准则是由那些最优秀、最有经验的程序员总结出来的最佳实践。
这些小项松散地被分到11个章节下面,每个章节都涵盖了软件设计的一个广泛的方面。这本书不需要一页一页地读,每一项都是独立的,正正好好。
这些项目被大量交叉引用,因此您可以轻松地在书中计划自己的课程。

自从这本书第二版出版后,Java平台又增添了很多新特性。这本书大部分都或多或少地用到了这些特性。这张表向您展示了主要覆盖了的关键特性:

特性 所在条目 版本
Lambdas 第42~44条 Java8
Streams 第45~48条 Java8
Optionals 第55条 Java8
Default methods in interfaces 第21条 Java8
try -with-resources 第9条 Java7
@SafeVarargs 第32条 Java7
Modules 第15条 Java9

大多数项目都用程序示例进行说明的。
这本书的一个重要特点是它通过一些代码示例,来阐明许多设计模式和习惯用法。
在适当的情况下,它们被交叉引用到这个领域的标准参考工作[Gamma95]。

很多项目都包含了一个或多个程序示例,来说明有些行为是可以避免的。
这种例子,被称为反例,然后被清楚地加上了注释,如“Never do this!”。
在每种情况下,该项目解释了为什么这个例子不好,并提出了另一种方法。

这本书不适合初学者:它假定您已经熟悉Java。
因为effective java是为那些有这门语言工作经验的人阅读的,所以它应该给那些高级开发人员提供更高级的使用。

这本书中的大部分规则都源于一些基本原则。简单明了就是是很重要的原则之一。组件的使用者不会对它的行为感到惊讶。
组件应该尽可能地小,但又不能太小。(就像这本书中提到的,这里的术语“组件”是指可重用的软件元素,即从一个独立的方法到一个由多个模块组成的复杂的框架,
都可以被称为“组件”)。
代码应该能重复使用而不是到处复制。组建之间的依赖应该保持低耦合。代码在完成之后错误应该尽快被检测出来,最好是在编译时期。

虽然这本书中的规则并不是100%的适用,但在绝大多数情况下它们确实都是最佳的编程实践。
你不应该盲目地遵循这些规则,如果有充分的理由,你也可以不遵循这些规则。
学习编程的艺术,就跟其它大多数学科一样,先要学习规则,然后要知道什么时候去打破规则。

大部分情况下,这本书并没有涉及性能方面。它指导我们如何写出清晰的,正确的,可重用的,健壮的,可维护的代码。如果你能做到这点,那么提升你想要的性能就是一件相对简单的事情了(Item 67)。
有些项目确实讨论了所关心的性能问题,有些项目还给出了有关性能的数据。这些数据在被介绍时,都提前说明是在“我的机器上”。这种描述是被认为最恰当的。

当讨论Java编程语言的特性和它的类库时,有时候需要引用特定版本。为了方便起见,这本书用别名来指定官方版本名。
下面的表展示了官方版本名和别名之间的映射关系。

官方版本名 别名
JDK 1.0.x Java 1.0
JDK 1.1.x Java 1.1
Java 2 Platform, Standard Edition, v1.2 Java 2
Java 2 Platform, Standard Edition, v1.3 Java 3
Java 2 Platform, Standard Edition, v1.4 Java 4
Java 2 Platform, Standard Edition, v5.0 Java 5
Java Platform, Standard Edition 6 Java 6
Java Platform, Standard Edition 7 Java 7
Java Platform, Standard Edition 8 Java 8
Java Platform, Standard Edition 9 Java 9

书中的例子都已经相当完整了,但是比完整性跟重要的是可读性。程序员们大量地使用java.util和java.io包下的类。为了成功编译书中的示例,您可能需要添加一个或多个导入声明,或其他这样的样板文件。
这本书的网址上Effective Java,包含了每个示例的一个完整版本,你可以下载下来编译并运行它。

大多数情况下,这本书里用到的技术术语都在Java SE 8这个版本的Java语言规范中定义的。其中有一些术语特别值得提出来。比如说,Java支持四种类型:接口(包括注解)、类(包括枚举)、数组和原生类型。前三种被称为引用类型。类的实例化和数组叫做对象,
而原生类型的值不是对象。类的成员包括它的字段、方法、成员类和成员接口。方法的签名包括它的名字和形参的类型;签名不包括方法的返回类型。

本书使用了一些与Java语言规范不同的术语。与Java语言规范不同,本书使用继承作为子类化的同义词。与使用术语继承来实现接口不同,这本书简单地说明了一个类实现了一个接口,或者一个接口继承了另一个接口。本书使用了传统的包私有的(package-private)访问级别,
而不是技术上正确的包访问(package access),来描述没有指定的访问级别。

这本书用到了一些《Java语言规范》没有定义的技术术语。API暴露出的术语(简称API)指程序员访问类、接口或包里面的的类、接口、构造函数、成员和序列化形式。术语API是application programming interface的简称,它更倾向于使用其他更好的术语接口,
以避免与该名称的语言结构混淆。编写使用API的程序的程序员被称为API的用户。通过API来实现的类叫做API的客户端。

类、接口、构造函数、成员和序列化形式统称为API元素。
一个暴露出来的API是由可以在定义该API的包外访问到的API元素组成。这些API元素可以给任意客户端使用,并且API的作者提供支持。不凑巧的是,它们也是Javadoc实用程序在其默认的操作模式中生成文档的元素。宽泛地说,一个包的对外API由公共和受保护的成员和包中的每个公共类或接口的构造函数组成。
在Java9中,模块系统被添加到平台里。如果一个库使用了模块系统,它对外的API是该模块系统声明对外包下的对外API的联和。
最后,提供一下Effective Java源码