作 者:(美)布洛克|译者:杨春花//俞黎敏 著作 定 价:52 出 版 社:机械工业出版社 出版日期:2010年09月01日 装 帧:平装 ISBN:9787111255833 你是否正在寻找一本能够更加深入地了解Java编程语言的书,以便编写出更清晰、更正确、更健壮且更易于重用的代码。不用找了!本书为我们带来了共78条程序员推荐的经验法则,针对你每天都会遇到的编程问题提出了有效、很实用的解决方案。 本书涵盖了自第l版之后所引入的Java E5和Java SE 6的特性,同时开发了新的设计模式和语言习惯用法,介绍了如何充分利用从泛型到枚举、从注解到自动装箱的各种特性。书中的每一章都包等
●译者序
●序
●前言
●致谢
●第yi章 引言
●第2章 创建和销毁对象
●? 第yi条:考虑用静态工厂方法代替构造器
●? 第2条:遇到多个构造器参数时要考虑用构建器
●? 第3条:用私有构造器或者枚举类型强化Singleton属性
●? 第4条:通过私有构造器强化不可实例化的能力
●? 第5条:避免创建不必要的对象
●? 第6条:消除过期的对象引用
●? 第7条:避免使用终结函数
●第3章 对于所有对象都通用的方法
●? 第8条:改写equals时请遵守通用约定
●? 第9条:改写equals时总要改写hashCode
●? 第yi0条:始终要改写toString
●? 第yi1条:谨慎地改写clone
●? 第yi2条:考虑实现Comparable接口
●第4章 类和接口
●部分目录
内容简介
本书介绍了在Java编程中78条极具实用价值的经验规则,这些经验规则涵盖了大多数开发人员每天所面临的问题的解决方案。通过对Java平台设计专家所使用的技术的全面描述,揭示了应该做什么,不应该做什么才能产生清晰、健壮和高效的代码。
本书中的每条规则都以简短、独立的小文章形式出现,并通过例子代码加以进一步说明。本书内容全面,结构清晰,讲解详细。可作为技术人员的参考用书。 (美)布洛克|译者:杨春花//俞黎敏 著作 Joshua Bloch是Google公司的首席Java架构师。是Jolt大奖的获得者。他曾是Sun公司的杰出工程师,和Transarc公司的不错系统设计师。Bloch曾带领团队设计和实现过无数的Java平台特性,包括JDK 5.0语言增强版和获奖的Java Collections Framework。他的著作还包括:《Java Puzzlers》、《Java Concurrency in Practive》等。 ????第2章?创建和销毁对象
????第4条:通过私有构造器强化不可实例化的能力
????有时候,你可能需要编写只包含静态方法和静态域的类。这些类的名声很不好,因为有些人在面向对象的语言中滥用这样的类来编写过程化的程序。尽管如此,它们也确实有它们特有的用处。我们可以利用这种类,以java.lang.Math或者java.util.Arrays的方式,把基本类型的值或者数组类型上的相关方法组织起来。我们也可以通过java.util.Collections的方式,把实现特定接口的对象上的静态方法(包括工厂方法,见靠前条)组织起来。很后,还可以利用这种类把final类上的方法组织起来,以取代扩展该类的做法。
????这样的工具类(utility?class)不希望被实例化,实例对它没有任何意义。然而,在缺少显式构造器的情况下,编译器会自动提供一个公有的、无参的缺省构造器等 ?
《Effective Java 中文版 第二版》 内容概述 《Effective Java 中文版 第二版》是一本旨在帮助 Java 开发者提升代码质量、编写更健壮、高效、可维护的 Java 程序的经典著作。本书深入探讨了 Java 语言的核心机制与最佳实践,通过一系列“条目”(Items)的形式,清晰地阐述了在实际开发中应该遵循的原则和应该避免的陷阱。本书的目标读者是拥有一定 Java 基础,希望进一步提升自身编程技艺的开发者,无论是初级开发者还是资深工程师,都能从中受益匪浅。 本书的独特之处在于其“Effective”的理念,即如何“有效地”利用 Java 语言的特性来编写出色的代码。 作者 Joshua Bloch 凭借其在 Java 平台开发方面的丰富经验,提炼出一套行之有效的编程指导方针。这些方针并非空中楼阁,而是建立在对 Java 虚拟机(JVM)、Java 语言规范以及 Java 标准库的深刻理解之上。本书的每一条都经过深思熟虑,并辅以清晰的示例代码,让读者能够直观地理解其背后的原理和实际应用。 核心章节与重点内容梳理 本书共分为十章,每一章都聚焦于 Java 编程中的一个关键领域,并提供一系列实用的建议。以下将对其中一些核心章节及其重点内容进行详细梳理: 第一部分:通用程序设计(General Programming) 第1条:考虑使用静态工厂方法代替构造器(Consider static factory methods instead of constructors)。 这一条是本书的开篇之作,强调了静态工厂方法相比于传统构造器的优势。静态工厂方法可以拥有描述性的名称,避免了构造器签名过长的问题;它们不需要创建新的对象实例,从而可以支持单例模式;它们还可以返回原接口类型,从而隐藏具体的实现类;更重要的是,它们能够根据参数的不同返回不同子类的实例,提供了更大的灵活性。本条通过对比构造器和静态工厂方法的具体场景,详细阐述了如何在创建对象时做出更优的选择。 第2条:在需要时,优先考虑构造器(When there is no alternative, prefer telescoping constructors to mandatory and optional arguments)。 尽管静态工厂方法有诸多好处,但在某些情况下,构造器仍然是必要的。这条则进一步强调了在确实需要构造器时,如何设计出更易于使用的构造器。它讨论了“伸缩构造器”(Telescoping Constructors)的模式,即通过一系列重载的构造器来处理不同数量的参数,并详细分析了这种模式的优缺点,以及何时应该选择它。 第3条:学会创建和管理资源(Always close resources)。 资源管理是 Java 编程中一个至关重要但又常常被忽视的环节。未关闭的资源,如文件句柄、数据库连接、网络套接字等,可能导致内存泄漏、性能下降甚至系统崩溃。本条详细介绍了 Java 中两种主要的资源管理方式:`try-finally` 语句块和 `try-with-resources` 语句。作者深刻剖析了 `try-finally` 的不足之处,并着重推荐了 `try-with-resources`,强调了其简洁性和安全性,并给出了实现 `AutoCloseable` 接口的详细指导。 第4条:避免重复创建昂贵对象(Prefer objects of the same type when the object is immutable)。 昂贵的对象,例如正则表达式编译后的对象、数据库连接池中的连接等,如果频繁创建和销毁,会严重影响程序的性能。本条强调了如何通过缓存、重用或者将其设计为不可变对象来避免重复创建这些昂贵对象。不可变对象的引入更是提升了并发安全性,减少了潜在的副作用。 第5条:避免使用终结器(Avoid finalizers)。 终结器(Finalizers)在 Java 中是一个颇具争议的特性。本条明确指出,终结器存在许多不可预测的行为,例如执行顺序不确定、可能导致对象被两次终结、性能损耗等。作者强烈建议开发者避免使用终结器,而是应该通过 `try-with-resources` 或者显式的关闭方法来管理资源。 第二部分:面向对象设计(Object-Oriented Design) 第6条:通过`Boolean`类重写`equals()`和`hashCode()`(Override `equals()` and `hashCode()` when you override `equals()`)。 `equals()` 和 `hashCode()` 方法是 Java 中用于对象相等性判断和哈希表存储的关键方法。当重写 `equals()` 方法时,必须同时重写 `hashCode()` 方法,以保证 `equals()` 相等的对象拥有相同的 `hashCode` 值。否则,在基于哈希的集合(如 `HashMap`、`HashSet`)中,将会出现无法预料的行为。本条详细阐述了这一原则,并提供了正确的 `equals()` 和 `hashCode()` 实现示例。 第7条:始终重写`toString()`方法(Always override `toString()`)。 `toString()` 方法用于返回对象的字符串表示形式,对于调试、日志记录和用户界面显示都非常有用。本书强调,一个好的 `toString()` 实现应该提供一个信息丰富且易于阅读的字符串,方便开发者理解对象的内部状态。 第8条:通过接口编程,而不是通过实现类(Program to interfaces, not implementations)。 这是面向对象设计中的一个基石原则。通过接口编程,可以极大地提高代码的灵活性和可维护性。接口定义了对象的行为规范,而实现类则提供了具体的实现。这种解耦使得开发者可以在不改变客户端代码的情况下,轻松地替换或扩展实现类,从而实现更好的模块化和可重用性。 第9条:优先使用组合,而不是继承(Prefer composition to extension)。 继承是面向对象设计中一个强大的工具,但过度使用继承可能会导致紧耦合、脆弱的基类问题以及代码难以复用。本条提倡使用组合(Composition)来构建类。组合允许一个类包含对另一个类的引用,并通过调用其方法来复用功能。组合提供了更大的灵活性,使得代码更易于维护和扩展。 第10条:用类而不是`String`来表示对象模型(Think about the model that you are creating.)。 这一条鼓励开发者仔细思考所要建模的对象,并为其设计合适的类结构。例如,对于表示“颜色”的概念,应该创建一个 `Color` 类,而不是简单地使用 `String`(如 "red", "blue")来表示。通过创建具体的类,可以封装行为,增强类型的安全性,并使代码更具表现力。 第三部分:泛型(Generics) 第23条:使用列表(List)而不是数组(Array)(Use lists rather than arrays)。 尽管数组在某些场景下性能较高,但它们是协变的(covariant)且大小固定的,这使得它们在使用时容易出现类型不匹配的错误,并且不够灵活。列表(`List`)则提供了更丰富的操作,并且是类型安全的。本条详细阐述了列表相比于数组的优势,并推荐在大多数情况下优先使用列表。 第24条:为泛型创建类型(Create generic types)。 泛型是 Java 5 引入的一项重要特性,它允许开发者编写能够处理多种类型的代码,从而避免了强制类型转换的麻烦,并提高了代码的安全性和可读性。本条指导读者如何为自己的类或接口创建泛型版本,以实现更通用的功能。 第25条:优先使用泛型方法(Prefer generic methods)。 泛型方法允许你声明一个方法,该方法可以与泛型类型一起工作,而无需将整个类声明为泛型。这提供了更大的灵活性,使得泛型能够应用于更广泛的场景。本条通过示例展示了如何创建和使用泛型方法。 第26条:利用泛型来提高代码的健壮性(Use bounded wildcards to increase flexibility)。 泛型通配符(Wildcards)是泛型中一个更高级的概念,它们允许在类型参数中使用 `?`。本条重点介绍了有界通配符(Bounded Wildcards),如 `? extends T` 和 `? super T`,它们可以显著提高泛型代码的灵活性,使其能够与更广泛的类型兼容。 第四部分:并发(Concurrency) 第64条:通过`java.util.concurrent`并发工具(Use the concurrent utilities of `java.util.concurrent`)。 Java 5 引入了强大的 `java.util.concurrent` 包,为并发编程提供了丰富而高效的工具,包括线程池、并发集合、同步器等。本条鼓励开发者利用这些成熟的并发工具,而不是自己从头开始编写复杂的同步代码,从而提高并发程序的健壮性和性能。 第65条:不要自己编写线程(Don't roll your own threads)。 手动管理线程的创建、启动、中断和同步是一项复杂且容易出错的任务。本条建议开发者应该使用更高层次的抽象,如线程池(Thread Pools),来管理线程的生命周期,并将任务提交给线程池执行,从而简化并发编程。 第66条:避免使用不安全的线程(Avoid shared mutable data)。 在并发环境中,共享可变数据是导致线程安全问题的根源。本条强调了如何通过各种机制来避免共享可变数据,例如使用不可变对象、同步机制(如锁)、并发集合以及原子变量。 本书的价值与影响 《Effective Java 中文版 第二版》之所以成为 Java 开发者必读的经典,在于其内容的深度、广度以及实践指导性。本书的内容覆盖了 Java 编程的方方面面,从基础的对象创建和资源管理,到高级的泛型和并发编程,都提供了详实而深入的解析。更重要的是,本书的每一条建议都充满了智慧和实战经验,能够帮助开发者在日常的编码工作中避免常见的错误,编写出更优质的代码。 通过阅读本书,开发者能够: 提升代码质量: 学习如何编写更健壮、更安全、更易于理解的代码。 提高编程效率: 掌握更高效的编程技巧,避免重复劳动和不必要的复杂性。 深入理解 Java: 深刻理解 Java 语言的底层机制和设计哲学。 成为更优秀的开发者: 培养良好的编程习惯和设计思维。 总而言之,《Effective Java 中文版 第二版》是一本集理论与实践于一体的优秀著作,它为 Java 开发者提供了一份宝贵的财富,能够指导他们走上编写高质量 Java 代码的道路,并在职业生涯中不断进步。本书中的每一条建议都经过了作者的反复推敲和验证,并已在无数的实际项目中得到检验,因此其价值毋庸置疑。