【发布时间】:2012-05-08 14:18:20
【问题描述】:
Effective Java #77 声明我们必须使用readResolve 在序列化期间保留单例保证。他们已经使用了这个例子。
public class Elvis implements Serializable{
public static final Elvis INSTANCE = new Elvis();
private Elvis() { ... }
public void leaveTheBuilding() { ... }
他们建议使用
如果猫王类是 实现可序列化, 以下 readResolve 方法就足够了 保证单例属性:
// readResolve for instance control - you can do better!
private Object readResolve() {
// Return the one true Elvis and let the garbage collector
// take care of the Elvis impersonator.
return INSTANCE; }
此方法忽略 反序列化的对象,返回 杰出的猫王实例是 类创建时创建 初始化。
- 现在的问题是 序列化再次加载类 有两个猫王的实例?
- 如果类只加载一次 那么我们应该只有一个 猫王的实例,因为静态 字段未序列化并且是 期间未恢复 反序列化和
- 另一个猫王从哪里来 实例来了 有资格进行垃圾收集 readResolve(防止 逃避反序列化 过程)。 可以解释一下吗?
【问题讨论】:
标签: java serialization singleton