再版前言.
自从我于2001年写了本书的第一版之后,Java平台又发生了很多变化,是该出第二版的时候了。Java 5中最为重要的变化是增加了泛型、枚举类型、注解、自动装箱和for-each循环。其次是增加了新的并发类库:java.util.concurrent,也在Java 5中进行了发布。我和Gilad Bracha一起,有幸带领团队设计了最新的语言特性。我还有幸参加了设计和开发并发类库的团队,这个团队由Doug Lea领导。
Java平台中另一个大的变化在于广泛采用了现代的IDE(Integrated Development Environment),例如Eclipse、IntelliJ IDEA和NetBeans,以及静态分析工具的IDE,如FindBugs。虽然我还未参与到这部分工作,但已经从中受益匪浅,并且很清楚它们对Java开发经历所带来的影响。
2004年,我从Sun公司换到了Google公司,但在过去的4年中,我仍然继续参与Java平台的开发,在Google公司和JCP(Java Community Process)的大力帮助下,继续并发和集合API的开发。我还有幸利用Java平台去开发供Google内部使用的类库。现在我了解了作为一名用户的感受。
我在2001年编写第一版的时候,主要目的是与读者分享我的经验,便于让大家能够避免我所走过的弯路,使大家更容易成功。新版仍然大量采用来自Java平台类库的真实范例。
第一版所带来的反应远远超出了我最大的预期。我在收集所有新的资料以使本书保持最新时,尽可能地保持了资料的真实。毫无疑问,本书的篇幅肯定会增加,从57个条目发展到了78个。我不仅增加了23个条目,并且修改了原来的所有资料,并删去了一些已经过时的条目。在附录中,你可以看到本书中的内容与第一版的内容的对照情况。
在第一版的前言中我说过:Java程序设计语言和它的类库非常有益于代码质量和效率的提高,并且使得用Java进行编码成为一种乐趣。Java 5和6发行版本中的变化是好事,也使得Java平台日趋完善。现在这个平台比2001年的要大得多,也复杂得多,但是一旦掌握了使用新特性的模式和惯用模式,它们就会使你的程序变得更完美,使你的工作变得更轻松。我希望第二版能够体现出我对Java平台持续的热情,并将这种热情传递给你,帮助你更加高效和愉快地使用Java平台及其新的特性。
Joshua Bloch
San Jose, California 2008年4月
初版前言
1996年,我打点行囊,西行来到了当时的JavaSoft工作,因为我很清楚那里将会出现奇迹。在那5年间,我担任Java平台类库的架构师。我曾经设计、实现和维护过许多类库,同时也担任过其他一些类库的技术顾问。能够主持这些类库的设计工作,并伴随着Java平台一起成熟和壮大,这是人生中难得的机会。毫不夸张地说,我有幸与一些当代最杰出的软件工程师一起工作过。在这个过程中,我学到了许多关于Java程序设计语言的知识——它能够做什么,不能够做什么,以及如何最有效地使用这门语言和它的类库。
本书是我的一次尝试,我希望与你分享我的经验,你可以因此而吸取我的经验,避免重蹈覆辙。我在本书中借鉴了Scott Meyers的《Effective C++》[Meyers98]一书的格式,该书中包含有50个条目,每个条目给出了一条用于改进程序性能和设计方案的规则。我觉得这种格式非常有效,希望你也有这样的感觉。
在许多例子中,我冒昧地使用了Java平台类库中的真实例子来说明相应的条目。在介绍那些做得不是很完美的工作时,我尽量使用我自己编写的代码,但是偶尔也会使用其他同事的代码。虽然我尽了最大的努力,但如果还是冒犯了他人,我在这里致以最诚挚的歉意。引用反面例子是出于协作的考虑,而不是要羞辱例子中的做法,我希望大家都能够从我们过去的错误经历中得到启发。
尽管本书并不是专门针对可重用组件的开发人员,但是过去20多年来我编写此类组件的经历一定会影响到这本书。我很自然地会按照可导出API(Application Programming Interfaces,应用程序编程接口)的方式来思考问题,而且我鼓励你也这样做。即使你并不是在开发可重用的组件,但是这样的思考方法往往能够提高你所编写的软件的质量。进一步来说,毫无意识地编写可重用组件的情形并不少见:你编写了一些很有用的代码,然后在同伴之间共享,不久之后你就有了很多用户。这时候,你就不能随心所欲地改变API了。如果你刚开始编写软件的时候在API的设计上尽了力,那么这时你就会非常庆幸了。
我把焦点放在API的设计上,这对于那些热衷于新兴的轻量化软件开发方法学(比如Extreme Programming[Beck99],中文译为“极限编程”,简称XP)的读者来说,也许会感到有点不舒服。这些方法学强调编写最简单的、能够工作的程序。如果你正在使用这其中的某种程序设计方法,那么你会发现,把焦点放在API设计上对于“重构(Refactoring)”过程是多么有益。重构的根本目标是改进系统结构,避免代码重复。如果系统的组件没有设计良好的API,要达到这样的目标则是不可能的。
任何一门语言都不是完美的,但是有些语言非常优秀。我认为Java程序设计语言以及它的类库就非常有益于代码质量和效率的提高,并且使得编码工作成为一种乐趣。我希望本书能够体现出我的热情并传递给你,帮助你更有效地使用Java语言,工作更为愉快。
Joshua Bloch Cupertino, California 2001年4月..
再版致谢
.我要感谢本书第一版的读者,给予了它如此热情的好评,感谢他们将书中的理念铭记在心,感谢他们让我知道该书给他们以及他们的工作带来了怎样积极的影响。我感谢许多教授在教学中采用了本书,感谢许多开发团队应用了本书。
我要感谢Addison-Wesley的整个团队,感谢他们的诚恳、专业、耐心,以及压力之下所体现出来的从容。编辑Greg Doench自始至终保持镇定自若:他是一名优秀的编辑,同时也是一位完美的绅士。产品经理Julie Nahil具备了产品经理应该具备的一切:勤奋、敏捷、训练有素,且待人和气。编审Barbara Wood一丝不苟,富有鉴赏能力。
我有幸再一次得到了所能想到的最佳审核团队的支持,我真诚地感谢他们中的每一位。核心团队负责审核每一个章节,他们包括:Lexi Baugher、Cindy Bloch、Beth Bottos、Joe Bowbeer、Brian Goetz、Tim Halloran、Brian Kernighan、Rob Konigsberg、Tim Peierls、Bill Pugh、Yoshiki Shibata、Peter Stout、Peter Weinberger以及Frank Yellin。其他审核人员包括:Pablo Bellver、Dan Bloch、Dan Bornstein、Kevin Bourrillion、Martin Buchholz、Joe Darcy、Neal Gafter、Laurence Gonsalves、Aaron Greenhouse、Barry Hayes、Peter Jones、Angelika Langer、Doug Lea、Bob Lee、Jeremy Manson、Tom May、Mike McCloskey、Andriy Tereshchenko以及Paul Tyma。这些审核人员再次提出了大量的建议,使本书得到了极大的改善,也让我避免了诸多尴尬。剩下的任何错误都是我自己的责任。
我要特别感谢Doug Lea和Tim Peierls,他们成了书中许多理念的倡导者。Doug和Tim为本书毫不吝惜地奉献了他们的时间和学识。
我要感谢我在Google的经理Prabha Krishna,感谢她持续不断的支持和鼓励。
最后,我要感谢我的妻子Cindy Bloch,她鼓励我写作,阅读了初稿中的每个条目,用Framemaker帮我排版,为我编写索引,在我写作的时候一直对我十分宽容。
初版致谢
感谢Patrick Chan力荐我编写本书,并说服编辑们接受了这一想法,包括丛书总编Lisa Friendly、丛书技术编辑Tim Lindholm以及Addison-Wesley的执行编辑Mike Hendrickson。感谢Lisa、Tim和Mike鼓励我投入这项计划,感谢他们超强的耐性以及永不放弃的信念,相信我总有一天会写成这本书。
感谢James Gosling和他最初的团队为我提供了一些很好的素材,感谢许多支持James的Java平台的工程师们。我要特别感谢Sun公司“Java Platform Tools and Libraries Group”的同事们,感谢他们的智慧、鼓励和支持。这个团队包括:Andrew Bennett、Joe Darcy、Neal Gafter、Iris Garcia、Konstantin Kladko、Ian Little、Mike McCloskey以及Mark Reinhold。之前还包括:Zhenghua Li、Bill Maddox和Naveen Sanjeeva。
感谢我的经理Andrew Bennett和主管Larry Abrahams,他们为这项计划提供了大力的支持。感谢Java Software的技术副总Rich Green为工程师们提供了良好的环境,让大家能够自由地发挥创造性的思维,自由地发表作品。
我有幸得到了所能想到的最佳审核团队的支持,我真诚地感谢他们中的每一位:Andrew Bennett、Cindy Bloch、Dan Bloch、Beth Bottos、Joe Bowbeer、Gilad Bracha、Mary Campione、Joe Darcy、David Eckhardt、Joe Fialli、Lisa Friendly、James Gosling、Peter Haggar、David Holmes、Brian Kernighan、Konstantin Kladko、Doug Lea、Zhenghua Li、Tim Lindholm、Mike McCloskey、Tim Peierls、Mark Reinhold、Ken Russell、Bill Shannon、Peter Stout、Phil Wadler,以及两位不知名的审核人员。他们提出了大量的建议,使本书得到了很大的改进,也让我避免了诸多尴尬。剩下的任何错误都是我自己的责任。
Sun公司里里外外的许多同事都参与了技术讨论,提升了本书的质量。他们中有:Ben Gomes、Steffen Grarup、Peter Kessler、Richard Roda、John Rose以及David Stoutamire,他们都奉献出了自己有用的才学。特别要感谢Doug Lea,他成了书中诸多理念的倡导者。Doug为本书毫不吝惜地奉献了自己的时间和学识。
感谢Julie Dinicola、Jacqui Doucette、Mike Hendrickson、Heather Olszyk、Tracy Russ,以及Addison-Wesley的整个团队,感谢他们的支持和专业的技能。尽管日程安排可能有些紧张,他们也始终十分友善和配合。
感谢Guy Steels为我撰写了前言。我为他的参与感到无比的荣幸。
最后,我要感谢我的妻子Cindy Bloch,感谢她鼓励我有时候甚至胁迫我编写本书。她阅读了初稿中的每个条目,用Framemaker帮我排版,为我编写索引,在我写作的时候一直对我十分宽容。...