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

Effective Java中文版第2版
作者 : Joshua Bloch
译者 : 杨春花 俞黎敏
出版日期 : 2008-12-16
ISBN : 7-111-25583-3
定价 : 52.00元
扩展资源下载
扩展信息
语种 : 简体中文
页数 : 287
开本 : 16开
原书名 : Effective Java Second Edition
原出版社:
属性分类: 店面
包含CD :
绝版 : 未绝版
图书简介

编码平添乐趣 程序更加完美 高效成为习惯 工作如此轻松
  你是否正在寻找一本能够更加深入地了解Java编程语言的书,以便编写出更清晰、更正确、更健壮且更易于重用的代码。不用找了!本书为我们带来了共78条程序员必备的经验法则,针对你每天都会遇到的编程问题提出了最有效、最实用的解决方案。
  这本经典Jolt获奖作品实属众望所归。作者对新版进行了彻底的更新,涵盖了自第1版之后所引入的Java SE 5和Java SE 6的特性,同时开发了新的设计模式和语言习惯用法,介绍了如何充分利用从泛型到枚举、从注解到自动装箱的各种特性。
  书中的每一章都包含几个“条目”,以简洁的形式呈现,自成独立的短文,它们提出了具体的建议,对于Java平台精妙之处的独到见解,以及优秀的代码范例。每个条目的综合描述和解释都阐明了应该怎么做,不应该怎么做,以及为什么。

本书的内容包括:
  ■全新的泛型、枚举、注解、自动装箱、for-each循环、可变参数、并发机制,等等。
  ■经典主题的全新技术和最佳实践,包括对象、类、类库、方法和序列化。
  ■如何避免Java编程语言中常被误解的细微之处:陷阱和缺陷。
  ■重点关注Java语言本身和最基本的类库及其扩展:java.lang、java.util、java.util.concurrent和java.io。

图书特色

图书前言

自从我于2001年写了本书的第1版之后,Java平台又发生了很多变化,是该出第2版的时候了。Java 5中最为重要的变化是增加了泛型、枚举类型、注解、自动装箱和for-each循环。其次是增加了新的并发类库:java.util.concurrent。我和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年编写第1版的时候,主要目的是与读者分享我的经验,便于让大家能够避免我所走过的弯路,使大家更容易成功。新版仍然大量采用来自Java平台类库的真实范例。
第1版所带来的反应远远超出了我最大的预期。我在收集所有新的资料以使本书保持最新时,尽可能地保持了资料的真实。毫无疑问,本书的篇幅肯定会增加,从57个条目发展到了78个。我不仅增加了23个条目,并且修改了原来的所有资料,并删去了一些已经过时的条目。在附录中,你可以看到本书中的内容与第1版的内容的对照情况。
在第1版的前言中我说过:Java程序设计语言和它的类库非常有益于代码质量和效率的提高,并且使得用Java进行编码成为一种乐趣。Java 5和6发行版本中的变化是好事,也使得Java平台日趋完善。现在这个平台比2001年的要大得多,也复杂得多,但是一旦掌握了使用新特性的模式和习惯用法,它们就会使你的程序变得更完美,使你的工作变得更轻松。我希望第2版能够体现出我对Java平台持续的热情,并将这种热情传递给你,帮助你更加高效和愉快地使用Java平台及其新的特性。

Joshua Bloch
San Jose, California
2008年4月

封底文字

编码平添乐趣 程序更加完美 高效成为习惯 工作如此轻松
  你是否正在寻找一本能够更加深入地了解Java编程语言的书,以便编写出更清晰、更正确、更健壮且更易于重用的代码。不用找了!本书为我们带来了共78条程序员必备的经验法则,针对你每天都会遇到的编程问题提出了最有效、最实用的解决方案。
  这本经典Jolt获奖作品实属众望所归。作者对新版进行了彻底的更新,涵盖了自第1版之后所引入的Java SE 5和Java SE 6的特性,同时开发了新的设计模式和语言习惯用法,介绍了如何充分利用从泛型到枚举、从注解到自动装箱的各种特性。
  书中的每一章都包含几个“条目”,以简洁的形式呈现,自成独立的短文,它们提出了具体的建议,对于Java平台精妙之处的独到见解,以及优秀的代码范例。每个条目的综合描述和解释都阐明了应该怎么做,不应该怎么做,以及为什么。

本书的内容包括:
  ■全新的泛型、枚举、注解、自动装箱、for-each循环、可变参数、并发机制,等等。
  ■经典主题的全新技术和最佳实践,包括对象、类、类库、方法和序列化。
  ■如何避免Java编程语言中常被误解的细微之处:陷阱和缺陷。
  ■重点关注Java语言本身和最基本的类库及其扩展:java.lang、java.util、java.util.concurrent和java.io。

图书序言

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

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

作者简介

Joshua Bloch:暂无简介

译者简介

杨春花 俞黎敏:暂无简介

译者序

Java从诞生到日趋完善,经过了不断的发展壮大,目前全世界拥有了成千上万的Java开发人员。如何编写出更清晰、更正确、更健壮且更易于重用的代码,是大家所追求的目标之一。作为经典Jolt获奖作品的新版书,它已经进行了彻底的更新,涵盖了自第1版之后所引入的Java SE 5和Java SE 6的新特性。作者探索了新的设计模式和语言习惯用法,介绍了如何充分利用从泛型到枚举、从注解到自动装箱的各种特性。本书的作者Joshua Bloch曾经是Sun公司的杰出工程师,带领团队设计和实现过无数的Java平台特性,包括JDK 5.0语言增强版和获奖的Java Collections Framework。他也是Jolt奖的获得者,现在担任Google公司的首席Java架构师。他为我们带来了共78条程序员必备的经验法则:针对你每天都会遇到的编程问题提出了最有效、最实用的解决方案。
  书中的每一章都包含几个“条目”,以简洁的形式呈现,自成独立的短文,它们提出了具体的建议、对于Java平台精妙之处的独到见解,并提供优秀的代码范例。每个条目的综合描述和解释都阐明了应该怎么做、不应该怎么做,以及为什么。通过贯穿全书透彻的技术剖析与完整的示例代码,仔细研读并加以理解与实践,必定会从中受益匪浅。书中介绍的示例代码清晰易懂,也可以作为日常工作的参考指南。
  适合人群
  本书不是针对初学者的,读者至少需要熟悉Java程序设计语言。如果你连equals()、toString()、hashCode()都还不了解的话,建议先去看些优秀的Java入门书籍之后再来阅读本书。如果你现在已经在Java开发方面有了一定的经验,而且想更加深入地了解Java编程语言,成为一名更优秀、更高效的Java开发人员,那么,建议你用心地研读本书。
  内容形式
  本书分为11章共78个条目,涵盖了Java 5.0/6.0的种种技术要点。与第1版相比,本书删除了“C语言结构的替代”一章,增加了Java 5所引入的“泛型”、“枚举和注解”各一章。数量上从57个条目发展到了78个,不仅增加了23个条目,并对原来的所有资料都进行了全面的修改,删去了一些已经过时的条目。但是,各章节没有严格的前后顺序关系,你可以随意选择感兴趣的章节进行阅读。当然,如果你想马上知道第2版究竟有哪些变化,可以参阅附录中第2版与第1版详细的对照情况。
  本书重点讲述了Java 5所引入的全新的泛型、枚举、注解、自动装箱、for-each循环、可变参数、并发机制,还包括对象、类、类库、方法和序列化这些经典主题的全新技术和最佳实践,如何避免Java编程语言中常被误解的细微之处:陷阱和缺陷,并重点关注Java语言本身和最基本的类库:java.lang、java.util,以及一些扩展:java.util.concurrent和java.io等等。
  章节简介
  第2章阐述何时以及如何创建对象,何时以及如何避免创建对象,如何确保它们能够被适时地销毁,以及如何管理销毁之前必须进行的所有清除动作。
  第3章阐述对于所有对象都通用的方法,你会从中获知对equals、hashCode、toString、clone和finalize相当深入的分析,从而避免今后在这些问题上再次犯错。
  第4章阐述作为Java程序设计语言的核心以及Java语言的基本抽象单元(类和接口),在使用上的一些指导原则,帮助你更好地利用这些元素,设计出更加有用、健壮和灵活的类和接口。
  第5和第6章中分别阐述在Java 1.5发行版本中新增加的泛型(Generic)以及枚举和注解的最佳实践,教你如何最大限度地享有这些优势,又能使整个过程尽可能地简单化。
  第7章讨论方法设计的几个方面:如何处理参数和返回值,如何设计方法签名,如何为方法编写文档。从而在可用性、健壮性和灵活性上有进一步的提升。
第8章主要讨论Java语言的具体细节,讨论了局部变量的处理、控制结构、类库的使用、各种数据类型的用法,以及两种不是由语言本身提供的机制(reflection和native method,反射机制和本地方法)的用法。并讨论了优化和命名惯例。
  第9章阐述如何充分发挥异常的优点,可以提高程序的可读性、可靠性和可维护性,以及减少使用不当所带来的负面影响。并提供了一些关于有效使用异常的指导原则。
  第10章阐述如何帮助你编写出清晰、正确、文档组织良好的并发程序。
  第11章阐述序列化方面的技术,并且有一项值得特别提及的特性,就是序列化代理(serialization proxy)模式,它可以帮助你避免对象序列化的许多缺陷。
  举个例子,就序列化技术来讲,HTTP会话状态为什么可以被缓存?RMI的异常为什么可以从服务器端传递到客户端呢?GUI组件为什么可以被发送、保存和恢复呢?是因为它们实现了Serializable接口吗?如果超类没有提供一个可访问的无参构造器,它的子类可以被序列化吗?当一个实例采用默认的序列化形式,并且给某些域标记为transient,那么当实例反序列化回来后,这些标志为transient域的值各是些什么呢?……这些问题如果你现在不能马上回答,或者不能很确定,没有关系,仔细阅读本书,你会对它们有更深入与透彻的理解。
  技术范围
  虽然本书是讨论更深层次的Java开发技术,讲述的内容深入,涉及面又相当广泛,但是它并没有涉及图形用户界面编程、企业级API以及移动设备方面的技术,不过在各个章节与条目中会不时地讨论到其他相关的类库。
  这是一本分享经验与指引你避免走弯路的经典著作,针对如何编写高效、设计优良的程序提出了最实用、最权威的指导方针,是Java开发人员案头上的一本不可或缺的参考书。
  本书由我组织进行翻译,第1章到第8章由杨春花负责,我负责前言、附录以及第9章到第11章的翻译,并负责本书所有章节的全面审校。参与翻译和审校的还有:荣浩、邱庆举、万国辉、陆志平、姜法有、王琳、林仪明、凌家亮、李勇、师文丽、刘传飞、王建旭、程旭文、罗兴、翟育明、黄华,在此深表感谢。
  虽然我们在翻译过程中竭力追求信、达、雅,但限于自身水平,也许仍有不足,还望各位读者不吝指正。关于本书的翻译和翻译时采用的术语表以及相关的技术讨论大家可以访问我的博客http://blog.csdn.net/YuLimin,也可以发邮件到YuLimin @ 163.com与我交流。
  在这里,我要感谢在翻译过程中一起讨论并帮助我的朋友们,他们是:崔毅,郑晖,左轻侯,郭晓刚,满江红开放技术研究组织创始人曹晓钢,Spring中文站创始人杨戈(Yanger),SpringSide创始人肖桦(江南白衣)和来自宝岛台湾的李日贵(jini)、林康司(koji)、林信良(caterpillar),还有责任编辑陈佳媛也为本书出版做了大量工作,在此再次深表感谢。
  快乐分享,实践出真知,最后,祝大家能够像我一样在阅读中享受本书带来的乐趣!
  Read a bit and take it out, then come back read some more.
  俞黎敏
  2008年11月

图书目录

译者序

前言
致谢
第1章  引言 1
第2章  创建和销毁对象 4
第1条:考虑用静态工厂方法代替构造器 4
第2条:遇到多个构造器参数时要考虑
用构建器 9
第3条:用私有构造器或者枚举类型强化Singleton属性 14
第4条:通过私有构造器强化不可
实例化的能力 16
第5条:避免创建不必要的对象 17
第6条:消除过期的对象引用 21
第7条:避免使用终结方法 24
第3章  对于所有对象都通用的方法 28
第8条:覆盖equals时请遵守通用约定 28
第9条:覆盖equals时总要覆盖hashCode 39
第10条:始终要覆盖toString 44
第11条:谨慎地覆盖clone 46
第12条:考虑实现Comparable接口 53
第4章  类和接口 58
第13条:使类和成员的可访问性最小化 58
第14条:在公有类中使用访问方法
而非公有域 62
第15条:使可变性最小化 64
第16条:复合优先于继承 71
第17条:要么为继承而设计,并提供文档
说明,要么就禁止继承 76
第18条:接口优于抽象类 82
第19条:接口只用于定义类型 86
第20条:类层次优于标签类 88
第21条:用函数对象表示策略 91
第22条:优先考虑静态成员类 94
第5章  泛型 97
第23条:请不要在新代码中使用
原生态类型 97
第24条:消除非受检警告 103
第25条:列表优先于数组 105
第26条:优先考虑泛型 109
第27条:优先考虑泛型方法 113
第28条:利用有限制通配符来提升API
的灵活性 117
第29条:优先考虑类型安全的异构容器 123
第6章  枚举和注解 128
第30条:用enum代替int常量 128
第31条:用实例域代替序数 137
第32条:用EnumSet代替位域 138
第33条:用EnumMap代替序数索引 140
第34条:用接口模拟可伸缩的枚举 144
第35条:注解优先于命名模式 147
第36条:坚持使用Override注解 152
第37条:用标记接口定义类型 154
第7章  方法 156
第38条:检查参数的有效性 156
第39条:必要时进行保护性拷贝 159
第40条:谨慎设计方法签名 163
第41条:慎用重载 165
第42条:慎用可变参数 170
第43条:返回零长度的数组或者集合,
而不是null 174
第44条:为所有导出的API元素
编写文档注释 176
第8章  通用程序设计 181
第45条:将局部变量的作用域最小化 181
第46条:for-each循环优先于传统的
for循环 184
第47条:了解和使用类库 187
第48条:如果需要精确的答案,请避免使用float和double 190
第49条:基本类型优先于装箱基本
类型 192
第50条:如果其他类型更适合,则尽量
避免使用字符串 195
第51条:当心字符串连接的性能 198
第52条:通过接口引用对象 199
第53条:接口优先于反射机制 201
第54条:谨慎地使用本地方法 204
第55条:谨慎地进行优化 205
第56条:遵守普遍接受的命名惯例 208
第9章  异常 211
第57条:只针对异常的情况才使用异常 211
第58条:对可恢复的情况使用受检异常,对编程错误使用运行时异常 214
第59条:避免不必要地使用受检的异常 216
第60条:优先使用标准的异常 218
第61条:抛出与抽象相对应的异常 220
第62条:每个方法抛出的异常
都要有文档 222
第63条:在细节消息中包含能
捕获失败的信息 224
第64条:努力使失败保持原子性 226
第65条:不要忽略异常 228
第10章  并发 229
第66条:同步访问共享的可变数据 229
第67条:避免过度同步 234
第68条:executor和task优先于线程 239
第69条:并发工具优先于wait和
notify 241
第70条:线程安全性的文档化 246
第71条:慎用延迟初始化 249
第72条:不要依赖于线程调度器 252
第73条:避免使用线程组 254
第11章  序列化 255
第74条:谨慎地实现Serializable接口 255
第75条:考虑使用自定义的序列化形式 260
第76条:保护性地编写readObject
方法 266
第77条:对于实例控制,枚举类型优先于readResolve 271
第78条:考虑用序列化代理代替
序列化实例 275
附录  第1版与第2版条目对照 278
中英文术语对照 280
参考文献 283

参考读物推荐
作者: 黄浩文 黄舒静
作者: Bruce Eckel
作者: Russ Olsen