public class Singleton implements Serializable { private static final Singleton INSTANCE = new Singleton(); private String name; public String getName() { return this.name;
} private Singleton() { this.name = "Neo";
} public static Singleton getInstance() { return INSTANCE;
} // 看这里
public Object readResolve() throws ObjectStreamException { return INSTANCE;
}
}
你再试一下,会发现变成 true 了。
因为在反序列化的时候,JVM 会自动调用 readResolve() 这个方法,我们可以在这个方法中替换掉从流中反序列化回来的对象。
这个方法完整的描述是这样的:
ANY-ACCESS-MODIFIER Object readResolve() throws ObjectStreamException;
总结
文中没有示例说反序列化在 enum 类中的表现,我直接说结论吧。enum 类自带这种特殊光环,不用写 readResolve() 方法就可以自动防止反序列化方式对单例的破坏。
Linux公社的RSS地址:https://www.linuxidc.com/rssFeed.aspx