如何在序列化的世界中保证Java实例控制(没有枚举)?

时间:2009-05-21 10:41:48

标签: java

在Java 1.5之前的世界中(所以没有enum)并且我的对象被序列化,我该如何强制执行适当的实例控制?我说的是这样一个类,据我所知,我不确定instance0和instance1将永远是唯一的实例。

import java.io.Serializable;

public final class Thing implements Serializable {

    private static final long serialVersionUID = 1L;

    public static final Thing instance0 = new Thing();
    public static final Thing instance1 = new Thing();

    private Thing(){};
}

3 个答案:

答案 0 :(得分:4)

你应该看看Effective Java。关于Singleton的章节对此进行了一些解释,并且有一章关于Typesafe枚举模式,这绝对会影响enum的实现方式。

简短的回答是你必须实施readResolve

答案 1 :(得分:2)

如果我理解正确,那么你要找的是采用Joshua Bloch的建议并实现readResolve方法来返回你的一个常量实例。

private Object readResolve() throws ObjectStreamException {
  return PRIVATE_VALUES[ordinal];  // The list holding all the constant instances
}

答案 2 :(得分:1)

这个link是sun的一个例子,与其他海报建议的Effective Java中的解决方案类似。