本书介绍了在Java编程中57条极具实用价值的经验规则,这些经验规则涵盖了大多数开发人员每天所面临的问题的解决方案。通过对Java平台设计专家所使用的技术的全面描述,揭示了应该做什么,不应该做什么才能产生清晰、健壮的高效的代码。
本书中的每条规则都以简短、独立的小文章形式出现,这些小文章包含了详细而精确的建议,以及对语言中许多细微之处的深入分析,并通过例子代码加以进一步说明。贯穿全书的是通用的语言用法的设计模式,以及一些具有启发意义的技巧的技术。
译者序
序
前言
第一章 引言
第二章 创建和销毁对象
第1条:考虑用静态工厂方法代替构造函数
第2条:使用私有构造函数强化singleton属性
第3条:通过私有构造函数强化不可实例化属性
第4条:避免创建重复的对象
条5条:消除对期的对象引用
第6条:避免使用终结函数
第三章 对于所有对象都通用的方法
第四章 类和接口
第五章 C语言结构的替代
第六章 方法
第七章 通用程序设计
第八章 异常
第九章 线程
第十章 序列化
中英文术语对照
参考文献
模式和习惯用法索引
索引
这是一本不起眼的小书,但是它里边介绍了不平凡的内容。
世界上每一件事情之所以会发生都有一定的原因,这本薄薄的小书能够获得第12届软件开发Jolt图书大奖(http://www.sdmagazine.com/),起初让我非常惊讶,但是当我接手重新翻译这本书的任务,仔细阅读之后,我知道它获得这个奖项是当之无愧的。
我曾经译写过多部软件开发类的图书,但是从来没有进入到Java世界中来,也没有做过Java平台上的开发工作,所以,翻译这本书主要靠在其他领域的经验和感觉,也算是一种胆大的尝试。尤其让我倍感压力的是,这本书已经有了第一次翻译,我能翻译得更好吗?不管怎么样,我尽力去做就是了。
这本书之于Java程序设计语言的意义,决不亚于Scott Meyers的《Effective C++》之于C++程序设计语言的意义。我之所以这么说,不仅仅是因为这本书借用了Scott Meyers的著书风格,更重要的是,它所介绍的内容都来自于第一线实践经验,书中的每一条规则都抓住了Java程序设计语言和平台库的关键之处。这些经验对于普通程序员而言,可以让他们迅速回归到Java语言所规定的正确道路上来;对于高级程序员而言,可以让他们把每天的使用经验上升到理论和规范的高度,使之适用于更广泛的场合。本书作者Joshua Bloch是Java Collections Framework的设计师,他还设计、指导和实现了其他一些可重用的类库。本书融入了作者多年的可重用组件设计经验,所以,您在阅读本书的时候,处处都能感受到作者的设计经历,包括经验和教训,也能感受到Java平台如何克服其原始的设计缺点,逐步走向完美和成熟。
毫无疑问,这本书不适合Java语言的初学者。它并没有指导您如何编写实用的Java程序,而是指导您在Java程序设计中需要遵循什么样的规则才能编写出高效、灵活、健壮、可重用的程序。作者把焦点集中在API的设计上,所以,如果您正在设计一个可重用的系统或者子系统,那么本书中的内容对您再合适不过了。
本书共包括57条程序设计建议,有的建议是几乎每一个熟练的Java程序设计人员都亲身经历过的,比如第2章中的一些通用方法,以及第3章中有关类和接口的设计规则;有的建议涉及到Java程序设计语言的一些高级用法,比如第5章介绍了如何代替C语言中的一些类型设施,第8章讨论了异常的一些用法;有的建议涉及到Java平台的底层系统,比如第9章讨论了Java平台上设计多线程程序应该注意的事项。这些建议涵盖了Java程序设计的方方面面,可以这样说,本书是Java程序设计浓缩的精华,每一条都值得您细细阅读和品味。
在内容叙述上,本书也颇具特色:
?在讲述每条规则的时候,使用了一些很有说服力的短小例子,这些例子大多来自于作者的亲身经历。
?客观地指出了Java语言和平台库中的一些设计缺陷,以及容易被忽略的实现细节。从这个意义上讲,本书称得上是一本“Java语言和平台库的技术内幕”。
?大量运用了模式和反模式。设计模式是人们对于普遍适用的设计方案的经验总结和提炼,反模式则是应该避免的设计方案。本书把Java语言和大量现有的设计模式有机地结合起来,同时也展现了一些在Java平台库成长过程中提炼出来的新模式。
?严谨的参考引用信息。作者不仅在叙述每个条目的时候,提供了前后相关的参考信息,同时也引用到其他一些经典资料。作者在许多细节上着墨并不多,但是他都提供了有关的参考资料,从而既保证了叙述的完整性,也保持了本书“精、巧”的特色。
本书包括这么多高质量的程序设计建议,我相信每一个有经验的Java程序设计人员都会喜欢和赞同这些建议。但是,如果把这些设计建议应用到日常的Java程序设计中,一定会编写出高质量的代码来吗?应该会的,但是这将使Java程序设计工作非常复杂,并且编写出来的代码不简洁,也不直观,这当然不符合Java语言的设计思想。所以,您需要用正确的态度来学习和使用这些设计规则。如果您正在设计可重用组件库,那么几乎每一个条目都有助于您设计出更合理的API来,您无论花多少时间来研究这些设计规则都是值得的。如果您正在设计普通的Java应用,那么,这些设计规则将有助于您更好地利用Java平台库来完成开发任务,而且一旦应用程序出现问题,您可以快速地诊断出问题所在,并找到合理的解决方案。
虽然这本书不适合Java语言的初学者,但是,如果您具有其他语言的程序设计经验,特别是C/C++语言的程序设计经验,那么本书对于您了解Java语言和平台库非常有帮助。而且,本书中的许多内容具有普遍适用性,并不局限于Java语言和平台,所以您一样可以从中学到有用的知识,甚至全面提升自己的程序设计能力。这是我翻译这本书过程中的切身体会。
由于本书内容深入,涉及面又比较广,加之我对于Java缺乏足够的实践经验,所以,翻译过程并不轻松,尽管对于一些疑难之处我查阅了有关的文档,特别是Java 2 平台的在线文档,但是,译文中错误在所难免,敬请读者谅解。为阅读方便,特在书后附上中英文术语对照。
这是一本好书,希望它不会辜负您的期待。
潘爱民
2002年10月于北京大学燕北园
Joshua Bloch是Sun公司的高级工程师,也是“Java平台核心组”的设计师。他设计并实现了获奖的Java Collections Framework和java.math软件包,并且对Java平台的其他部分也做出了贡献。Joshua是许多技术文章和论文的作者,他的关于抽象数据对象复制的博士论文获得过“ACM杰出博士论文奖”提名。他拥有哥伦比亚大学的学士学位和卡耐基-梅隆大学的博士学位。
潘爱民 浙江海宁人,现任职于北京大学计算机科学技术研究所,副研究员;研究方向为信息安全(包括网络安全和公钥技术)和软件开发(包括组件技术和模式);主要著作有《COM原理与应用》等,译著有《Visual C++技术内幕》(第4版)、《COM本质论》和《C++ Primer中文版》等。
1996年,我打点行囊,西行来到了当时的JavaSoft,因为我很清楚那里将会出现奇迹。在这5年间,我担任Java平台库的设计师。我曾经设计、实现和维护过许多库,同时也担任其他一些库的技术顾问。伴随着Java平台的成熟和壮大,主持这些库的设计工作是一个人一生中难得的机会。毫不夸张地说,我有幸与一些当代最杰出的软件工程师一起工作。在这个过程中,我学到了许多关于Java程序设计语言的知识—它能够做什么,不能够做什么,如何最有效地使用这门语言和它的库。
本书是我的一次尝试,我希望与你分享我的经验,你可以因此而吸取我的经验,避免重复我的失败。本书中我借用了Scott Meyers的《Effective C++》[Meyers98]一书的格式,该书中包含有50个条目,每个条目给出了一条用于改进程序性能和设计方案的规则。我觉得这种格式非常有效,希望你也有这样的感觉。
在许多例子中,我冒昧地使用了Java平台库中的真实例子来说明相应的条目。在介绍那些做得不是很完美的工作时,我尽量使用我自己编写的代码,但是偶尔我也会使用其他同事的代码。尽管我尽力做得更好一点,但是如果我真的冒犯了他人,我在这里致以最诚挚的歉意。引用反面例子是出于协作的考虑,而不是要羞辱例子中的做法,我希望大家都能够从我们过去的错误经历中得到启发。
尽管本书并不只是针对可重用组件开发人员的,但是过去20多年来我编写此类组件的经历一定会影响到这本书。我很自然地会按照可导出API的方式来思考问题,而且我鼓励你也这样做。即使你并没有开发可重用的组件,但是这样的思考方法有助于你提高软件的质量。进一步来说,毫无意识地编写可重用组件的情形并不少见:你编写了一些很有用的代码,然后在同伴之间共享,不久之后你就有了很多用户。这时候,你就不能随心所欲地改变API了,并且如果你刚开始编写软件的时候在设计API上付出了较多的努力,那么这时你就会非常庆幸了。
我把焦点放在API的设计上,这对于那些热衷于新兴的轻量级软件开发方法学(比如Extreme Programming[Beck99],中文译为“极限编程”,简称XP)的读者来说,也许会显得有点不太自然。这些方法学强调编写最简单的、能够工作的程序。如果你正在使用某种此类的程序设计方法,那么你会发现,把焦点放在API设计上对于“重构(refactoring)”过程是多么有益。重构(refactoring)的基本目标是改进系统结构,以及避免代码重复。如果系统的组件没有设计良好的API,则要达到这样的目标是不可能的。
没有一门语言是完美的,但是有些语言非常优秀。我认为Java程序设计语言以及它的库非常有益于代码质量和效率的提高,并且使得编码工作成为一种乐趣。我希望本书能够抓住我的热情并传递给你,帮助你更有效地使用Java语言,工作更为愉快。
Joshua Bloch
Cupertino, California
2001年4月