一本书的好坏除去它本身的好坏外,总是和读它的人和读的时候相关的。我看过好些 Java 书,对于自己看过的这些书我总是掺杂着自己的喜好和偏见。这篇文章会讲讲我看过的一些觉得值得一提的 Java 书,希望能对其他想深入学习 Java 的人一点可以参考的意见。

一些我感觉非常值得读的书

Effective Java
推荐程度:★★★★★
喜欢程度:★★★

书里介绍了 Java 、面向对象乃至程序设计上的一些最佳实践,是本非常不错的 Java 进阶书(并不适合只有很少 Java 经验的人看)。实际上,许多 Java 类库(比如说 Guava)乃至语言(Kotlin)都受到这本书的深远影响。

在看了这本书的一段时间里,我逐渐了解到 Java 里的那些斑斑驳驳(比如说设计得一塌糊涂的序列化——没有什么比在一个 Java 类里写些 privatereadObject 之类的方法更奇怪的事情了),Java 并没有我想得那么好。

Java Concurrency in Practice
推荐程度:★★★★★
喜欢程度:★★★★★

书里详细地介绍了并发相关的知识和 Java 中并发的运用以及一些并发的高级主题。虽然这本书出版得比较早,只介绍到 JDK 6 的并发,也没有介绍其他的并发模型,但是我觉得这是一本超级值得一读得并发书,是一块了解并发相关知识的基石。

这本书可能是我看过的 Java 书里最喜欢的一本,书里弥漫着知识与见地!从并发的概念乃至一些一些并发相关的知识以及 Java 相关的并发类库都介绍得非常详尽,同时这本书也适合作为平时 Java 开发时并发相关内容的参考手册进行使用。

一些我觉得不错的书

Java Puzzlers: Traps, Pitfalls, and Corner Cases
推荐程度:★★★★
喜欢程度:★★★★★

书里介绍了一些 Java 相关的陷阱和一些怪异的例子。书是采用先让你看一段程序,然后让你猜结果的方式写的。每个问题的后一页会对这个例子的结果进行解释,讲述这个问题是如此产生的、如何更好地避免这个错误(比如说语言设计层面或者在编程方式上),书里交替地出现谜题和解惑,此外书里还有些很有趣的插画。

在我看了 《Essential vs Accidental Complexity in Scala & Dotty》 这个视频之后,就看了这本书。每一门编程语言本身都有其复杂性,一门语言设计的语法或者一些 API 的设计乃至计算机的模型都可以加剧这种复杂性。一门编程语言的一个设计决策也许看上去是正确的,但是这门语言许许多多的设计决策(语法)交织在一些事,许多反自觉的地方乃至陷阱出现了。一门编程语言可以从中吸取教训而改进,使用这门语言的人可以通过编译器或者其他工具进行提醒,我们也可以通过学习这些进行预防。就算是 Java 这样很难有什么改变的语言也可以从这些教训中,也可以为以后的语法决策进行警惕,毕竟 Java 应该还不会到 9 就结束吧?

Java 8 in Action
推荐程度:★★★★
喜欢程度:★★★★

书里详细介绍了 Java 8 的语言特性和一些类库的使用、函数式编程相关的一些内容。

书里 Java 8 的内容介绍得还是蛮详细的。这书非常适合对函数式编程不是很了解并且想学习 Java 8 的人看,并且能从中学到很多新的知识。但是对于对函数式编程比较熟的人来说,可能会感觉比较啰嗦(尤其是对于会 Scala 的人来说更是如此了),不过类库方面比如说 收集器、Fork/Join (Java 7 里的)和 Spliterator 还是蛮值得看一下的,看完也能对 Java 8 的一些细节和整体的有个不错认识。书里还介绍了些基于 Java 8 下的重构、测试,虽然感觉只是简单地从匿名函数替换成了 Lambda 表达式。

Java SE 8 for the Really Impatient
推荐程度:★★★★
喜欢程度:★★★★★

书里简单讲了下 Java 8 里的一些特性还有 Java 7 和 8 里一些杂七杂八的改进。

这本书在 Java 8 上介绍的没有 《Java 8 in Action》 详细,而且有些比较重要的 Java 8 的类库的内容的使用并没有介绍到。不过这本书另外介绍了 JavaFX、Javascript 引擎(感觉这个作者好多本 Java 书都介绍了 Scripting API)。不过我感觉这本书最有用和值得看的地方是 Java 8 里对 atomic 包、ConcurrentHashMap 、一些杂项(还包含 Java 7 的)的改进。这边书的并发部分和 《Java 8 in Action》 可以作为对 《Java Concurrency in Practice》 未覆盖的 JDK 7 和 8 的并发的改进的补全。

Thinking in Java
推荐程度:★★★
喜欢程度:★★

这本书非常详细地介绍了 Java (到 JDK 5)的一些语法和 Java 相结合的设计模式和编程思想。

这本书不适合初学,感觉比较适合 Java 已经入门的人看。可能是我已经比较熟悉 Java 了才读的这书,感觉这本书很多方面介绍到详细到啰嗦的地步。也许我已经永久地错过了读这书的好时机。读后的想法是,这并不是一本必读的书,不用太遗憾,这是我想和所有没读过这书的人说的话。

一些值得一提的书

The Well-Grounded Java Developer
推荐程度:★★★
喜欢程度:★★

这本书(这段介绍复制自原书)第一部分全面介绍 Java 7 的新特性,第二部分探讨 Java 关键编程知识和技术(NIO、依赖注入和并发),第三部分讨论JVM 上的新语言和多语言编程,第四部分将平台和多语言编程知识付诸实践(测试、CI 和 Web 开发)。

这本书的这本书介绍的内容还是蛮多的,然而基本上都是浅尝辄止,没什么深入……感觉也许依赖注入那章值得看一下,其他好些章讲的并没有其他类似资料的好,感觉可能只能给读者的人大概介绍下相关的知识,然后让读者在想要学习的方面继续学习下去……也许这书值得潦草翻一下,增加下相关方面的广度。

A Little Java, A Few Patterns
推荐程度:★★
喜欢程度:★★★

这本书采用一问一答的方式来介绍 Java 并且引入了一些设计模式。

这是本不厚而且也看得比较快的书,书比较浅,比较适合入门编程的人看。整本书实际上只是通过引入 Java 来介绍讲述什么是编程以及一些设计模式。除了书的表述方式(有点意思)和书是 little 系列外,我觉得这其实只是本很平常的书,也许找个阳光明媚的下午看看也许不错?

Java: The Complete Reference
推荐程度:★★
喜欢程度:★

这本书前面部分详细地介绍了 Java 的语法,后面开始就是非常详尽的类库的介绍。

其实这就是本参考手册,书厚到有一千两百多页。前面非常乏味地介绍了 Java 相关的语法,然后后面就是无尽的 API 参考和例子。这本书不适合用来学习 Java,而适合拿一本来放到工作的地方用来查阅一些不常用的 API 的相关的例子。书里的语法部分缺乏重点,不适合当编程书来看,而 API 例子部分,感觉很多例子也不是非常的好,一些比较有用的 API 用法也不一定有介绍到。

测试相关的书

Growing Object-Oriented Software, Guided by Tests
推荐程度:★★
喜欢程度:★

这本书先简单地介绍了一些测试相关的知识(并结合了面向对象),再从一个 Swing 的例子入手,讲述如何从一个例子开始构建代码并进行测试,并在介绍的过程中深入测试的一些理念。

这本书我看了两遍,但是每次都中途放弃了……这是本非常有名的 Java 测试方面的书,被非常多的人推荐,这也是为什么我放弃后又拿起这本书重新看的理由。我感觉这本书的内容编排上非常合理,从一个例子入手,然后在构建的过程中测试和重构来讲述TDD。但是那些冗长和复杂的例子渐渐消磨了我的耐心,于是我就放弃了。这是本我不是很喜欢或者觉得有趣的书,但是我觉得对 Java 测试感兴趣的人可以亲自去读一下,也许能达到比我更远的终点……

Practical Unit Testing with JUnit and Mockito
推荐程度:★★★★★
喜欢程度:★★★★

这本书非常详尽地介绍了测试方面相关的概念和内容,并且还介绍了 Java 里 JUnit 和 Mockito 的使用。

我另外还看过其他 Java 测试相关的书,比如说 《Pragmatic Unit Testing in Java 8 with JUnit》,但是我感觉这本书在测试相关的概念上比起其他书来说概念上介绍更细致,而且也有很多非常实战的建议。我觉得这本书非常适合那些想入门测试的人。在看了这本书后再学一下 Google 的 truth 测试框架也是一个不错的选择。

最后

实际上上面我介绍的书里并没有 Java 入门相关的书,在我入门 Java 后的那么多年来,我已经对我看过的那些入门的 Java 书的印象稀薄了很多,感觉很多看法并不能成为什么意见,而且我也不会会去重新看那些入门 Java 的书了。

另外这本书这本书也没有介绍一些软件开发的书(其实甚至是以 Java 为例子的书)。如果现在让我草率地推荐的话,我应该会推荐 《Refactoring: Improving the Design of Existing Code》 或者 《Head First Design Patterns: A Brain-Friendly Guide》 吧。在你掌握了 Java 后,学习下一些有名的 Java 类库和框架怎么用或者学习其他 JVM 系的语言也可以,不过人的选择各异,Java 的世界比这还要广阔,其他的语言的世界也尽是如此。

最后我想说的是,以上的书目只是我的个人的喜好,如果你的意见和我大相径庭,这也再正常不过,毕竟人的看法各异,希望不会伤到你对其中的一些书的喜爱之情。