Introduction
本书旨在帮助您有效地使用 Java 编程语言及其基础库:java.lang,java.util 和 java.io,以及 java.util.concurrent 和 java.util.function等子包。 也会涉及到其他的类库。
本书一共九十小节,每个小节讲述了一条规则。 这些规则实践通常会使那些最优秀和最富有经验的程序员从中受益。 所有的内容分为11章,每章都涉及软件设计的一个广泛方面。 本书不打算从头到尾阅读:每个小节都或多或少地独立存在。 这些小节有很多交叉引用,因此您可以通过本书轻松绘制自己的课程。
自本书上一版出版以来,该平台增加了许多新功能。 本书中的大多数项目都以某种方式使用这些功能。 此表显示了主要功能的主要覆盖范围:
Screen Shot 2018-09-30 at 9.38.24 PM.png
大多数项目都用程序示例说明。 本书的一个关键特性是它包含说明许多设计模式和习语的代码示例。 在适当的情况下,它们与该领域的标准参考工作[Gamma95]相互参照。
许多小节包含一个或多个程序示例,说明了要避免的一些实践。 这样的例子,有时被称为反模式,清楚地标有评论,例如 //never do this!
在每种情况下,该项目都解释了为什么示例不好并提出了另一种方法。
本书不适合初学者:它假设您已经熟悉Java。 如果不是,请考虑许多优秀的入门级书籍之一,例如Peter Sestoft的Java Precisely [Sestoft16]。 虽然Effective Java旨在让任何具有该语言工作知识的人都可以阅读,但它应该为高级程序员提供思考的空间。
本书中的大多数规则都源于一些基本原则。 清晰和简洁至关重要。 组件的用户不应该对其行为感到惊讶。 组件应尽可能小,但不能小。 (正如本书中所使用的,术语组件是指任何可重用的软件元素,从单个方法到由多个包组成的复杂框架。)代码应该被重用而不是被复制。 组件之间的依赖关系应保持最小。 错误应该在发生后尽快检测到,理想情况是在编译时。
虽然本书中的规则并非100%适用,但在绝大多数情况下,它们都是最佳编程实践的特征。你不应该盲目地遵守这些规则,而只是偶尔并且有充分的理由违反这些规则。像大多数其他学科一样,学习编程艺术包括首先学习规则,然后学习何时打破规则。
在大多数情况下,本书不涉及性能。它是关于编写清晰,正确,可用,健壮,灵活和可维护的程序。如果你能做到这一点,那么获得所需的性能通常是一件相对简单的事情(第67条)。有些项目确实讨论了性能问题,其中一些项目提供了性能数据。使用短语“在我的机器上”引入的这些数字应该被认为是最近的。
值得一提的是,我的机器是老旧的自制3.5GHz四核英特尔酷睿i7-4770K,配备16千兆位DDR3-1866 CL9内存,运行Azul的Zulu 9.0.0.15版本的OpenJDK,在Microsoft Windows 7 Professional SP1(64-位)。
在讨论Java编程语言及其库的功能时,有时需要参考特定版本。 为方便起见,本书使用昵称而不是正式版本名称。 此表显示版本名称和昵称之间的映射:
Screen Shot 2018-09-30 at 9.48.26 PM.png
这些例子相当完整,但有利于完整性的可读性。他们可以自由地使用java.util和java.io包中的类。为了编译示例,您可能必须添加一个或多个导入声明或其他此类样板。该书的网站http://joshbloch.com/effectivejava包含每个示例的扩展版本,您可以编译和运行它。
在大多数情况下,本书使用了Java语言规范Java SE 8 Edition [JLS]中定义的技术术语。一些术语值得特别提及。该语言支持四种类型:接口(包括注释),类(包括枚举),数组和基元。前三个被称为参考类型。类实例和数组是对象;原始值不是。类的成员由其字段,方法,成员类和成员接口组成。方法的签名由其名称和形式参数的类型组成;签名不包括方法的返回类型。
本书使用的几个术语与Java语言规范不同。与Java语言规范不同,本书使用继承 inheritance 作为子类 subclassing 的同义词。本书不是对接口使用术语继承,而是简单地声明一个类实现一个接口或一个接口扩展另一个接口。要描述在未指定时应用的访问级别,本书使用传统的package-private而不是技术上正确的包访问[JLS,6.6.1]。
本书使用了一些未在Java语言规范中定义的技术术语。术语“导出API”或简称“API”是指程序员访问类,接口或包时所使用的类,接口,构造函数,成员和序列化形式。 (API是应用程序编程接口的缩写,优先于其他优选的术语接口,以避免与该名称的语言结构混淆。)编写使用API的程序的程序员被称为作为API的用户。其实现使用API的类是API的客户端。
类,接口,构造函数,成员和序列化表单被统称为API元素。导出的API包含可在定义API的包之外访问的API元素。这些是任何客户端都可以使用的API元素,并且API的作者承诺支持。并非巧合的是,它们也是Javadoc实用程序以其默认操作模式生成文档的元素。简而言之,包的导出API由包中每个公共类或接口的公共成员和受保护成员以及构造函数组成。
在Java 9中,模块系统被添加到平台中。如果库使用模块系统,则其导出的API是库的模块声明导出的所有包的导出API的并集。
网友评论