On Java 8 - On Java 中文版

图书信息

  • 英文书名:On Java 8

  • 中文书名:On Java 中文版

  • 作者:[美] Bruce Eckel

  • 译者:孙卓 / 陈德伟 / 臧秀涛

  • 页数:正文 1243 页(基础卷 808 页 + 进阶卷 435 页) / 附录 103 页(基础卷 3 页 + 进阶卷 100 页)

  • 英文出版社:MindView LLC

  • 中文出版社:人民邮电出版社 / 图灵教育

  • 出版日期:英文原版 2011 / 简体中文版 2012

  • 个人分类:软件工程 / 软件测试

  • ISBN:基础卷 978-7-115-58501-1 / 进阶卷 978-7-115-58502-8

书评

写于2022年9月23日。

书本身是基于Java 8编写的,英文原书出版于2017年,但由于出版社引进中文翻译时请求作者针对Java 11和Java 17进行了更新,所以目前应当可以认为内容是最新的,不用过于担心时效性问题。这本书的作者Bruce Eckel可能认识的人不多,但说起他曾经的著作《Java编程思想》,应当是有不少人知道的,而这本书可以视为最新的《Java编程思想》,至于老的《Java编程思想》,应当是不用看了。

基础卷主要涉及的是类、集合、函数式编程(流)、异常、文件、字符串、反射、泛型、数组等内容。其中,基础卷前半本花了整整八章来讲详细阐释面向对象相关的知识,很多细节应当是经验老道的Java程序员也不清楚的。这一方面是由于Java对面向对象的考量确实比较多,另一方面也要在一定程度上归功于作者本人对Java极其深入的理解。

比较有趣的是,尽管Java和“函数式编程”几乎站在了对立面,但Java 8引入的Lambda表达式和Stream API却至少看起来非常“函数式”。很奇怪的是很多人至今对Java的认识仍停留在Java 6甚至Java 5上,而Java 8在2014年引入的Stream API至今在很多企业开发中仍无人问津,实在是匪夷所思。比较遗憾的是,Java由于其残缺的泛型机制(类型擦除)导致的基本类型上的问题,Lambda表达式的实现还是比较丑陋的,存在大量相关的类以极不优雅的名称存在于函数式API中。

现在学校的教学与许多工程师对Java的理解似乎仍然停留在Java 6甚至Java 5时代,对新特性怀着一种近似于抵触的态度。事实上,在当前最新的LTS版本Java 17下,写出的Java代码已经可以有大大不同于先前的体验,这种提升或许不如从C++ 98到C++ 11的提升来得感受明显,但也能确实地拥有一种完全不同的体验。

言归正传。基础卷的异常部分比较简单,主要讲了讲Java的受检异常,不必多提。在测试上也只是讲了点调试的基本知识。文件部分,这本书只讲了nio,io只提了几句。虽然稍微有点极端,但目前在非性能敏感的情况下nio确实远好于io,而且在并行情况下甚至优于io,倒也算合适。至于字符串,其实Java没太多好说的,基本介绍什么语言这块内容都差不多。

然后是反射和泛型,书中对这方面的探讨是比较深入的,讨论了很多比较深入的情况。这部分虽然理解起来有一定难度,但个人认为是相当精彩的。

整本书读下来,倒是让我对Java的观点有了些改观。与很多人理解的不同,Java的设计逻辑其实是简化——极致的简化。不同于Python在语法上追求简单而将大部分复杂逻辑隐藏在背后,Java是真正地在追求简单——它干脆不提供它认为“过于复杂”的功能,比如操作符重载。Java同时也是一门一开始就面向工程的语言,这也是Java加入检查型异常的原因——它试图从静态层面规避一部分容易使代码出错的问题,虽然检查型异常(至少在Java里)并不成功。Java最初诞生的原因其实是认为C++过于复杂。

是的,所以Java其实是非常简单的,它的内核就是简单易上手并且工程化。然而由于Java当年的一些设计失误(也受限于时代),其冗长的语法却给人以臃肿笨拙的印象。

总的来说,Java能够流行起来主要要归功于它的中庸。尽管Java语法冗长臃肿,且存在大量过时设计遗留的糟粕,甚至现在看来Java完全面向对象的设计也存在一定问题,但Java的中庸性仍使它相当适应企业应用开发。如Java采用完全面向对象的方式强制程序员进行合理整洁的代码组织,这是其他许多语言做不到的。此外,Java在保持其中庸性的同时以最保守的方式与时俱进,不至于与其他主流编程语言脱离太远,如Java 8的Stream API设计就是一众显而易见的平衡。很多人会说Java烂,事实的确如此,但Java为什么至今仍能占据这样的地位,这确实是值得我们思考的。

不过,尽管这本书在详尽的同时配上了许多代码示例(这也是为什么这书这么厚,实际上大多数是代码),但理解起来仍有一些难度,尤其不适合完全的初学者进行学习。大量的代码示例实际上也是另一种阅读压力。尽管整体阅读体验良好,也不存在滞涩,但这些似乎有些过量的代码示例确实给我带来了一些思维压力。

综合来讲,这本书对于任何稍有一些Java编程经验的程序员都是推荐阅读的。但也要做好细心研究的准备,毕竟这不是本走马观花地读就能有收获的书。

最后更新于