Update 03. 使用私有构造方法或枚类实现Singleton属性.md

This commit is contained in:
Joe
2019-08-04 21:21:48 +08:00
committed by GitHub
parent a71dbfd0da
commit c5fbb35f5c

View File

@@ -35,7 +35,7 @@ public class Elvis {
  静态工厂方法的一个优点是,它可以灵活地改变你的想法,无论该类是否为单例而不必更改其 API。 工厂方法返回唯一的实例,但是可以修改,比如,返回调用它的每个线程的单独实例。 第二个好处是如果你的应用程序需要它可以编写一个泛型单例工厂generic singleton factory 详见第30 条)。 使用静态工厂的最后一个优点是方法引用可以用 `supplier`,例如 `Elvis::instance` 等同于 `Supplier<Elvis>`。 除非与这些优点相关的,否则公共属性方法是可取的。
  创建一个使用这两种方法的单例类(第 12 章),仅仅将 `implements Serializable` 添加到声明中是不够的。为了维护单例的保证,声明所有的实例属性为 `transient`,并提供一个 `readResolve` 方法(详见第 89条。否则每当序列化实例被反序列化时就会创建一个新的实例在我们的例子中导致出现新的 Elvis 实例。为了防止这种情况发生,将这个 `readResolve` 方法添加到 Elvis 类:
  创建一个使用这两种方法的单例类(第 12 章),仅仅将 `implements Serializable` 添加到声明中是不够的。为了保证单例模式不被破坏,声明所有的实例属性为 `transient`,并提供一个 `readResolve` 方法(详见第 89 条)。否则,每当序列化实例被反序列化时,就会创建一个新的实例,在我们的例子中,导致出现新的 Elvis 实例。为了防止这种情况发生,将这个 `readResolve` 方法添加到 Elvis 类:
```java
// readResolve method to preserve singleton property