史上最好的Java书之一是这本,bookauthority中排名第二

在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程序员,正在寻求一本好书, 那就考虑这一本吧。

相关推荐
呵呵哒( ̄▽ ̄)"3 分钟前
vue.js 展示树状结构数据,动态生成 HTML 内容
开发语言·前端·javascript·vue.js
好看资源平台7 分钟前
Spring 全家桶使用教程 —— 后端开发从入门到精通
java·数据库·spring
Satan71211 分钟前
【Spring】Spring Aop基础入门
java·开发语言·jvm
A8644516 分钟前
解决在Nignx下Thinkphp路由不生效问题
开发语言·nginx·php·thinkphp
这河里吗l19 分钟前
Java每日面试题(JVM)(day15)
java·开发语言·jvm·笔记·后端
Rverdoser21 分钟前
macOS 系统中python的安装步骤
开发语言·python·macos
white__ice22 分钟前
2024.9.27
java
robot_大菜鸟36 分钟前
Powerbi -l9-异常数据的处理
android·java·powerbi
AutoAutoJack37 分钟前
C#的结构体(Struct)应用示例
开发语言·数据结构·人工智能·c#
江南一点雨38 分钟前
又一家培训机构即将倒闭!打工人讨薪无果,想报名的小伙伴擦亮眼睛~
java·程序员