Effective.Java中文版(第3版).pdf下载分享
- 资源分享
- 15小时前
- 1热度
- 0评论
资料简介
《Effective Java》中文版第三版,由国外权威作者编写并翻译的Java编程经典教材,提供了深入浅出的学习内容和实用技巧。本书适合所有级别的开发人员阅读。
-
文件名称:Effective.Java中文版(第3版).pdf
-
文件类型:PDF文档
-
文件标签:Java编程、开发者手册、技术书籍

内容预览
ewective-java-3rd-chinese
前51条:文章翻译来源地址:https://www.jianshu.com/c/ce8cf0e13b23
现在全部章节已经更新完成
github pages :提供更好的在线阅读版本
gitee pages : 提供更快的访问速度
pdf 下载
about this repository
本来以为只是个直接搬运的活,实际上不是。主要工作如下:
改进排版,原有博文排版不太优秀,根据markdwon 排版指北重新排版。
内容修改,原作者在翻译过程中有笔误(可能打字太快了),这里进行修改。
等待内容搬运完成,使用cmd markdown生成 pdf 离线文件
markdown 文件以及英文版原版链接也都放在了 github 上面,希望小伙伴也可以中英文对照,给出一些意见。
额外资源
ewective-java-2nd 中文版
ewective-java-3rd 英文版
ewective-java-3rd 源代码
友情链接
On Java 8中文版
- 考虑使用静态工厂方法替代构造方法 一个类允许客户端获取其实例的传统方式是提供一个公共构造方法。 其实还有另一种技术应该成为每个程序员 工具箱的一部分。 一个类可以提供一个公共静态工厂方法,它只是一个返回类实例的静态方法。 下面是一个 Boolean 简单的例子(boolean 基本类型的包装类)。 此方法将 boolean 基本类型转换为 Boolean 对象引 用: 注意,静态工厂方法与设计模式中的工厂方法模式不同[Gamma95]。本条目中描述的静态工厂方法在设计模式中 没有直接的等价。 类可以为其客户端提供静态工厂方法,而不是公共构造方法。提供静态工厂方法而不是公共构造方法有优点也有 缺点。 静态工厂方法的一个优点是,不像构造方法,它们是有名字的。 如果构造方法的参数本身并不描述被返回的对 象,则具有精心选择名称的静态工厂更易于使用,并且生成的客户端代码更易于阅读。 例如,返回一个可能为素数 的 BigInteger 的构造方法 BigInteger(int,int,Random) 可以更好地表示为名为 BigInteger.probablePrime 的静态工厂方法。 (这个方法是在 Java 1.4 中添加的。) 一个类只能有一个给定签名的构造方法。 程序员知道通过提供两个构造方法来解决这个限制,这两个构造方法 的参数列表只有它们的参数类型的顺序不同。 这是一个非常糟糕的主意。 这样的 API 用户将永远不会记得哪个构造 方法是哪个,最终会错误地调用。 阅读使用这些构造方法的代码的人只有在参考类文档的情况下才知道代码的作 用。 因为他们有名字,所以静态工厂方法不会受到上面讨论中的限制。在类中似乎需要具有相同签名的多个构造方法 的情况下,用静态工厂方法替换构造方法,并仔细选择名称来突出它们的差异。 静态工厂方法的第二个优点是,与构造方法不同,它们不需要每次调用时都创建一个新对象。 这允许不可变的 类 (条目 17) 使用预先构建的实例,或者在构造时缓存实例,并反复分配它们以避免创建不必要的重复对象。 Boolean.valueof(boolean) 方法说明了这种方法:它从不创建对象。这种技术类似于 Flyweight 模式 [Gamma95]。如果经常请求等价对象,那么它可以极大地提高性能,特别是如果在创建它们非常昂贵的情况下。 静态工厂方法从重复调用返回相同对象的能力允许类保持在任何时候存在的实例的严格控制。这样做的类被称为 实例控制( instance-controlled)。编写实例控制类的原因有很多。实例控制允许一个类来保证它是一个单例 (3) 项或 不可实例化的 (条目 4)。同时,它允许一个不可变的值类 (条目 17) 保证不存在两个相同的实例:当且仅当 a == b 时 a.equals(b) 。这是享元模式的基础[Gamma95]。Enum 类型 (条目 34) 提供了这个保证。 静态工厂方法的第三个优点是,与构造方法不同,它们可以返回其返回类型的任何子类型的对象。 这为你在选 择返回对象的类时提供了很大的灵活性。 这种灵活性的一个应用是 API 可以返回对象而不需要公开它的类。 以这种方式隐藏实现类会使 API 非常紧凑 I。 这种技术适用于基于接口的框架(条目 20),其中接口为静态工厂方法提供自然返回类型。 在 Java 8 之前,接口不能有静态方法。根据约定,一个名为 Type 的接口的静态工厂方法被放入一个非实例化 的伙伴类 (companion class)(条目 4) Types 类中。例如,Java 集合框架有 45 个接口的实用工具实现,提供不可修改 的集合、同步集合等等。几乎所有这些实现都是通过静态工厂方法在一个非实例类 ( java .util. collections ) 中导出的。返回对象的类都是非公开的。 public static Boolean valueOf(boolean b) { return b ? Boolean.TRUE : Boolean.FALSE; }
Collections 框架 API 的规模要比它之前输出的 45 个单独的公共类要小得多,每个类有个便利类的实现。不
仅是 API 的大部分减少了,还包括概念上的权重:程序员必须掌握的概念的数量和难度,才能使用 API。程序员知道
返回的对象恰好有其接口指定的 API,因此不需要为实现类读阅读额外的类文档。此外,使用这种静态工厂方法需要
客户端通过接口而不是实现类来引用返回的对象,这通常是良好的实践 (条目 64)。
从 Java 8 开始,接口不能包含静态方法的限制被取消了,所以通常没有理由为接口提供一个不可实例化的伴随
类。 很多公开的静态成员应该放在这个接口本身。 但是,请注意,将这些静态方法的大部分实现代码放在单独的包
私有类中仍然是必要的。 这是因为 Java 8 要求所有接口的静态成员都是公共的。 Java 9 允许私有静态方法,但静态
字段和静态成员类仍然需要公开。
静态工厂的第四个优点是返回对象的类可以根据输入参数的不同而不同。 声明的返回类型的任何子类都是允许
的。 返回对象的类也可以随每次发布而不同。
EnumSet 类(条目 36)没有公共构造方法,只有静态工厂。 在 OpenJDK 实现中,它们根据底层枚举类型的大
小返回两个子类中的一个的实例:如果大多数枚举类型具有 64 个或更少的元素,静态工厂将返回一个
RegularEnumSet 实例, 返回一个 long 类型;如果枚举类型具有六十五个或更多元素,则工厂将返回一个
JumboEnumSet 实例,返回一个 long 类型的数组。
这两个实现类的存在对于客户是不可见的。 如果 RegularEnumSet 不再为小枚举类型提供性能优势,则可以
在未来版本中将其淘汰,而不会产生任何不良影响。 同样,未来的版本可能会添加 EnumSet 的第三个或第四个实
现,如果它证明有利于性能。 客户既不知道也不关心他们从工厂返回的对象的类别; 他们只关心它是 EnumSet 的一
些子类。
静态工厂的第 5 个优点是,在编写包含该方法的类时,返回的对象的类不需要存在。 这种灵活的静态工厂方法
构成了服务提供者框架的基础,比如 Java 数据库连接 API(JDBC)。服务提供者框架是提供者实现服务的系统,并且系
统使得实现对客户端可用,从而将客户端从实现中分离出来。
服务提供者框架中有三个基本组:服务接口,它表示实现;提供者注册 API,提...
