单例模式的安全性(2)

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

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/db427b35c0ece144ff1004c517eafbae.html