0

我正在阅读有关 Singleton 设计模式的一些内容,结果发现实现可序列化 Singleton 的一种好方法是拥有一个readResolve返回真实实例和声明的所有成员的方法transient。我有一些问题:

  1. 如果在反序列化时你仍然得到真正的实例而不是序列化的实例,那么序列化不是没用吗?反正你会失去一切。
  2. 如果我对上面的 1. 有误,那么声明所有成员为瞬态是否仍会丢失所有成员的值?再说一遍,序列化不是没用吗?
  3. 如果所有成员数据丢失,是否有需要序列化 ​​Singleton 的情况?

谢谢。

4

2 回答 2

0

重点不是序列化状态并将其反序列化。重点是,在序列化和反序列化期间,您最终可能会创建多个您希望成为 Singleton 的类的实例。因此,如何阻止这种情况发生是您要解决的问题的重点。解决方案就像你提到的 -

readResolve 方法返回真正的实例和声明为瞬态的所有成员*

如此真实,您没有保存和检索状态。但是你在序列化和反序列化期间阻止你的单例有多个实例,这在单例的上下文中更为重要。希望这有帮助。

于 2013-06-02T09:09:47.047 回答
0

这完全取决于你的单身人士是什么。考虑这个例子:

public class Apple implements Serializable {
    private List<Worm> worms = Collections.emptyList();

    ...
}

Collections.emptyList()是单例。但是当你序列化一个苹果时,序列化它是有意义的。并且在反序列化苹果时,你想取回单例空列表,而不是这个单例的新副本。

于 2013-05-30T22:08:08.343 回答