【发布时间】:2016-05-06 10:11:52
【问题描述】:
在阅读 Effective Java 时,我发现实现单例最有用的方法就是使用 enums 和单个 INSTANCE。但如果我们需要将其设为一个类,根据他的一些建议,完美的可序列化线程安全单例类应该如下所示:
public class SerializableSingletonClass implements Serializable{
private static final long serialVersionUID = 1L;
private int value;
private String name;
private SerializableSingletonClass(int value, String name) {
if( value < 0 ) throw new IllegalArgumentException("Value may not be less than 0");
this.value = value;
this.name = Validate.notNull(name, "Name may not be null");
}
private static class SerializableSingletonHolder{
public static final SerializableSingletonClass INSTANCE;
static {
INSTANCE = new SerializableSingletonClass(0, "default");
}
}
private void readObject(ObjectInputStream stream) throws InvalidObjectException{
throw new InvalidObjectException("proxy required");
}
private Object writeReplace(){
return new SerializationProxy(this);
}
private static class SerializationProxy implements Serializable{
private static final long serialVersionUID = 1L;
public SerializationProxy(SerializableSingletonClass ignored) { } //Here is the question
private Object readResolve(){
return SerializableSingletonHolder.INSTANCE;
}
}
}
据我所知,他建议将序列化实例替换为当前使用的实例。
那么,为什么我们需要使单例序列化,因为它们的序列形式永远不会被使用。我们只是把它扔掉,用当前的实例替换反序列化的实例。
对我来说,实现可序列化单例的问题看起来只是一个理论上的问题。根据我所说,反序列化单例没有多大意义(在enums 的情况下也是如此)。
那么我错过了什么?不能再详细一点吗?
【问题讨论】:
标签: java serialization singleton