1

如果我将“A”类定义为单例,则意味着我只能创建“A”类的一个对象。如果我将其设置为可序列化并对其进行序列化,那么如何实现同一对象的单例状态?

4

3 回答 3

3

引用Effective Java #77,你应该看看实现readResolve方法。

readResolve 功能允许您用另一个实例替换由 readObject [Serialization, 3.7] 创建的实例。如果要反序列化的对象的类定义了带有正确声明的 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;
}
}
于 2013-01-15T07:39:41.050 回答
1

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

对于实例控制,更喜欢枚举类型而不是 readResolve

于 2013-01-15T07:29:42.107 回答
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; 
  }

}

于 2013-01-15T10:17:14.397 回答