更新第一条

This commit is contained in:
sjsdfg 2019-05-27 11:08:05 +08:00
parent 906d4bcc1c
commit 683f306c9d

View File

@ -22,15 +22,15 @@ public static Boolean valueOf(boolean b) {
  **静态工厂方法的第二个优点是,与构造方法不同,它们不需要每次调用时都创建一个新对象。** 这允许不可变的类 (详见第 17 条)使用预先构建的实例,或者在构造时缓存实例,并反复分配它们以避免创建不必要的重复对象。`Boolean.valueof(boolean)` 方法说明了这种方法:它从不创建对象。这种技术类似于 `Flyweight` 模式[Gamma95]。如果经常请求等价对象,那么它可以极大地提高性能,特别是如果在创建它们非常昂贵的情况下。
  静态工厂方法从重复调用返回相同对象的能力允许类保持在任何时候存在的实例的严格控制。这样做的类被称为实例控制( instance-controlled。编写实例控制类的原因有很多。实例控制允许一个类来保证它是一个单例 (3) 项或不可实例化的 (条目 4)。同时,它允许一个不可变的值类(详见第 17 条)保证不存在两个相同的实例:当且仅当 `a == b``a.equals(b)`。这是享元模式的基础[Gamma95]。`Enum` 类型(详见第 34 条)提供了这个保证。
  静态工厂方法从重复调用返回相同对象的能力允许类保持在任何时候存在的实例的严格控制。这样做的类被称为实例控制( instance-controlled。编写实例控制类的原因有很多。实例控制允许一个类来保证它是一个单例 (3) 项或不可实例化的(详见第 4 条)。同时,它允许一个不可变的值类(详见第 17 条)保证不存在两个相同的实例:当且仅当 `a == b``a.equals(b)`。这是享元模式的基础[Gamma95]。`Enum` 类型(详见第 34 条)提供了这个保证。
  **静态工厂方法的第三个优点是,与构造方法不同,它们可以返回其返回类型的任何子类型的对象。** 这为你在选择返回对象的类时提供了很大的灵活性。
  这种灵活性的一个应用是 API 可以返回对象而不需要公开它的类。 以这种方式隐藏实现类会使 API 非常紧凑 I。 这种技术适用于基于接口的框架(条目 20),其中接口为静态工厂方法提供自然返回类型。
  这种灵活性的一个应用是 API 可以返回对象而不需要公开它的类。 以这种方式隐藏实现类会使 API 非常紧凑 I。 这种技术适用于基于接口的框架(详见第 20 条),其中接口为静态工厂方法提供自然返回类型。
  在 Java 8 之前,接口不能有静态方法。根据约定,一个名为 `Type` 的接口的静态工厂方法被放入一个非实例化的伙伴类companion class详见第 4 条)`Types` 类中。例如Java 集合框架有 45 个接口的实用工具实现,提供不可修改的集合、同步集合等等。几乎所有这些实现都是通过静态工厂方法在一个非实例类 (`java .util. collections`) 中导出的。返回对象的类都是非公开的。
  `Collections` 框架 API 的规模要比它之前输出的 45 个单独的公共类要小得多,每个类有个便利类的实现。不仅是 API 的大部分减少了,还包括概念上的权重:程序员必须掌握的概念的数量和难度,才能使用 API。程序员知道返回的对象恰好有其接口指定的 API因此不需要为实现类读阅读额外的类文档。此外使用这种静态工厂方法需要客户端通过接口而不是实现类来引用返回的对象这通常是良好的实践 (条目 64)
  `Collections` 框架 API 的规模要比它之前输出的 45 个单独的公共类要小得多,每个类有个便利类的实现。不仅是 API 的大部分减少了,还包括概念上的权重:程序员必须掌握的概念的数量和难度,才能使用 API。程序员知道返回的对象恰好有其接口指定的 API因此不需要为实现类读阅读额外的类文档。此外使用这种静态工厂方法需要客户端通过接口而不是实现类来引用返回的对象这通常是良好的实践(详见第 64 条)
  从 Java 8 开始,接口不能包含静态方法的限制被取消了,所以通常没有理由为接口提供一个不可实例化的伴随类。 很多公开的静态成员应该放在这个接口本身。 但是,请注意,将这些静态方法的大部分实现代码放在单独的包私有类中仍然是必要的。 这是因为 Java 8 要求所有接口的静态成员都是公共的。 Java 9 允许私有静态方法,但静态字段和静态成员类仍然需要公开。