如何在Serialized对象上维护Singleton状态?

时间:2013-01-15 07:23:34

标签: java serialization singleton

如果我将Class'A'定义为Singleton意味着我只能创建一个类'A'的对象。如果我把它作为Serializable并序列化它然后如何实现同一对象的Singleton状态?

3 个答案:

答案 0 :(得分:3)

引用Effective Java #77,您应该考虑实施readResolve方法。

  

readResolve功能允许您将另一个实例替换为该实例   由readObject [Serialization,3.7]创建。如果对象的类是deserial-   ized定义了一个带有正确声明的readResolve方法,这个方法是   在反序列化后在新创建的对象上调用。对象引用   然后返回此方法返回的代替新创建的对象。在   大多数使用此功能,不保留对新创建的对象的引用,因此它   立即有资格进行垃圾收集。

public class Elvis implements Serializable {
public static final Elvis INSTANCE = new Elvis();
// 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;
}
}

答案 1 :(得分:1)

为了保证Serializable单例的唯一性,您可能需要自定义readResolve方法来返回单例对象而不是新反序列化的对象。另一方面,书“Effective Java”Item77建议:

  

例如,控制,首选枚举类型为readResolve

答案 2 :(得分:1)

在反序列化任何对象之前,一个方法被调用的是readResolve(),因此我们可以简单地从该方法返回相同的状态对象而不实际反序列化它。

请参阅下文,

public final class MySingleton {
  private MySingleton() { }

  private static final MySingleton INSTANCE = new MySingleton();

  public static MySingleton getInstance() { return INSTANCE; }

  private Object readResolve() throws ObjectStreamException {
   // instead of the object we're on, 
   // return the class variable INSTANCE
  return INSTANCE; 
  }

}