首页>参考读物>计算机科学与技术>软件与程序设计

Effective Java中文版
作者 : (美)Joshua Bloch
译者 : 潘爱民
出版日期 : 2003-01-01
ISBN : 7-111-11385-3
定价 : 39.00元
扩展资源下载
扩展信息
语种 : 简体中文
页数 : 214
开本 : 16开
原书名 : Effective Java Programming Language Guide
原出版社: Addison-Wesley
属性分类: 店面
包含CD :
绝版 : 未绝版
图书简介

本书介绍了在Java编程中57条极具实用价值的经验规则,这些经验规则涵盖了大多数开发人员每天所面临的问题的解决方案。通过对Java平台设计专家所使用的技术的全面描述,揭示了应该做什么、不应该做什么才能产生清晰、健壮和高效的代码。
  本书中的每条规则都以简短、独立的小文章形式出现,这些小文章包含了详细而精确的建议,以及对语言中许多细微之处的深入分析,并通过例子代码加以进一步说明。贯穿全书的是通用的语言用法和设计模式,以及一些具有启发意义的技巧和技术。

  ◆“真希望10年前我就能拥有这本书。可能有人会认为我不需要任何关于Java的书籍,但是我确实需要这本书。”
                  ——James Gosling,Java之父,Sun公司副总裁

  ◆“一本非常优秀的书,充满了各种关于使用Java程序设计语言和面向对象程序设计的好的建议。”
                     ——Gilad Bracha, Sun公司计算机科学家,《The Java TM Language Specificationy》(Second
Edition)的作者之一

图书特色

作者简介
  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月


请注意
本书索引所列页码,皆为英文原书页码。

图书序言

如果有一个同事这样对你说,“我的配偶今天这个晚上在家里制造了一场不同寻常的晚餐,你愿意参加我们吗?”(Spouse of me this night today manufactures the unusual meal in a home. You will join?)这时候你脑子里会想到三件事情:第一,同事是在邀请你参加家庭晚宴;第二,英语不是这位同事的母语;第三,有一顿可口的晚餐在等着你。
如果曾经学习过第二种语言,并尝试在课堂之外使用这种语言,那么你该知道有三件事情是必须要掌握的:这门语言的结构如何(语法)、如何命名你想谈论的事物(词汇),以及如何用习惯和高效的方式来表达事情(用法)。在课堂上通常只是涉及到前面两点,而当你努力使对方明白你的意思的时候,你常常会发现当地人对你的表述忍俊不禁。
对于程序设计语言,也是如此。你需要理解语言的核心:它是面向算法的,还是面向函数的,或者是面向对象的?你需要知道词汇表:标准库提供了哪些数据结构、操作和功能设施?你还需要熟悉如何用习惯和高效的方式来构建代码。关于程序设计语言的书籍通常只是涉及到前面两点,或者只是蜻蜓点水般地介绍一下用法。也许原因在于,前面两点更加容易编写。语法和词汇是语言本身固有的特性,但是用法则反映了使用这门语言的群体的特征。
例如,Java程序设计语言是一门只支持单继承的面向对象程序设计语言,在每一个方法内部,它也支持命令方式的(面向语句的,statement-oriented)编码风格。Java库包括对图形显示、网络、分布式计算和安全性的支持。但是,如何把这门语言以最佳的方式用到实践中呢?
还有一点,程序与口头的句子以及大多数书籍和杂志不同,它是会随着时间而变化的。仅仅编写出能够有效地工作并且能够被别人理解的代码往往是不够的,我们还必须要把代码组织成易于修改的形式。针对一个任务T可能会有10种不同的编码方法,而在这10种方法中,有7种方法是笨拙的、低效的或者是难以理解的。而在剩下的3种编码方法中,哪一种会最接近该任务T的下一年度版本的代码呢?
目前有大量的书籍可以供你学习Java程序设计语言的语法,包括《The Java Programming Language》[Arnold00](作者Arnold、Gosling和Holmes,2000),以及《The Java Language Specification》[JLS](作者Gosling、Joy和Bracha)。同样地,关于Java库和API的书籍也有很多。
本书定位在你的第三个需要上:习惯和高效的用法。作者Joshua Bloch在Sun Microsystems公司多年来一直从事Java语言的扩展、实现和使用的工作;他还阅读了其他人的大量代码,包括我的代码。他在本书中提出了许多好的建议,他按照系统化的方式把这些建议组织起来,这些建议的宗旨在于如何更好地构造你的代码以便它们工作得更好,以便其他人也能够理解这些代码,以便将来对代码做修改和增强的时候不会头痛,甚至,你的程序因此而变得更加令人舒适、更加优美和雅致。

Guy L. Steele Jr.
Burlington, Massachusetts
2001年4月

作者简介

(美)Joshua Bloch:暂无简介

译者简介

潘爱民:暂无简介

译者序

这是一本不起眼的小书,但是它里边介绍了不平凡的内容。
世界上每一件事情之所以会发生都有一定的原因,这本薄薄的小书能够获得第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月于北京大学燕北园

图书目录

第1章  引言 1
第2章  创建和销毁对象 4
第1条:考虑用静态工厂方法代替构造函数 4
第2条:使用私有构造函数强化singleton
属性 8
第3条:通过私有构造函数强化不可实例化
的能力 10
第4条:避免创建重复的对象 11
第5条:消除过期的对象引用 14
第6条:避免使用终结函数 17
第3章  对于所有对象都通用的方法 21
第7条:在改写equals的时候请遵守通用
约定 21
第8条:改写equals时总是要改写hashCode 31
第9条:总是要改写toString 36
第10条:谨慎地改写clone 39
第11条:考虑实现Comparable接口 46
第4章  类和接口 51
第12条:使类和成员的可访问能力最小化 51
第13条:支持非可变性 55
第14条:复合优先于继承 62
第15条:要么专门为继承而设计,并给出
文档说明,要么禁止继承 67
第16条:接口优于抽象类 72
第17条:接口只是被用于定义类型 76
第18条:优先考虑静态成员类 78
第5章  C语言结构的替代 82
第19条:用类代替结构 82
第20条:用类层次来代替联合 84
第21条:用类来代替enum结构 88
第22条:用类和接口来代替函数指针 97
第6章  方法 100
第23条:检查参数的有效性 100
第24条:需要时使用保护性拷贝 103
第25条:谨慎设计方法的原型 107
第26条:谨慎地使用重载 109
第27条:返回零长度的数组而不是null 114
第28条:为所有导出的API元素编写
文档注释 116
第7章  通用程序设计 120
第29条:将局部变量的作用域最小化 120
第30条:了解和使用库 123
第31条:如果要求精确的答案,请避免
使用float和double 127
第32条:如果其他类型更适合,则尽量避免
使用字符串 129
第33条:了解字符串连接的性能 131
第34条:通过接口引用对象 132
第35条:接口优先于映像机制 134
第36条:谨慎地使用本地方法 137
第37条:谨慎地进行优化 138
第38条:遵守普遍接受的命名惯例 141
第8章  异常 144
第39条:只针对不正常的条件才使用异常 144
第40条:对于可恢复的条件使用被检查的
异常,对于程序错误使用运行时
异常 147
第41条:避免不必要地使用被检查的异常 149
第42条:尽量使用标准的异常 151
第43条:抛出的异常要适合于相应的抽象 153
第44条:每个方法抛出的异常都要有文档 155
第45条:在细节消息中包含失败-捕获信息 157
第46条:努力使失败保持原子性 159
第47条:不要忽略异常 161
第9章  线程 162
第48条:对共享可变数据的同步访问 162
第49条:避免过多的同步 168
第50条:永远不要在循环的外面调用wait 173
第51条:不要依赖于线程调度器 175
第52条:线程安全性的文档化 178
第53条:避免使用线程组 181
第10章  序列化 182
第54条:谨慎地实现Serializable 182
第55条:考虑使用自定义的序列化形式 187
第56条:保护性地编写readObject方法 193
第57条:必要时提供一个readResolve方法 199
中英文术语对照 202
参考文献 207
模式和习惯用法索引 212
索引 214

教学资源推荐
作者: 裘宗燕,李安邦 编著
作者: (美)Al Kelley,Ira Pohl
作者: Patrick Henry Winston, Sundar Narasimhan
参考读物推荐
作者: 吴惠茹 等编著
作者: 成林 著
作者: Cay S. Horstmann, Gary Cornell