我们一直在阅读有关如何使用'readResolve()'以确保在序列化Singleton的情况下的单一性的信息。但是首先要序列化Singleton的实际用例是什么?
编辑:请。注意:问题是关于为什么要序列化Singleton,而不是什么安全的方法。
最佳答案
该对象可能是一个单例对象,但它可能是一个更大的结构的一部分,而这个结构还不太清楚。例如,它可以实现一个接口,该接口可以具有几种不同的实现(因此,具有多个实例):
interface StringSink extends Serializable { void dump(String s); }
class MultiDumper implements Serializable {
private final StringSink sink;
public MultiDumper(StringSink sink){ this.sink = sink; }
void doSomeStuff(Collection<String> strings){
for (String s : strings) sink.dump(s);
}
}
现在,假设我们想要一个
StringSink
,它将字符串转储到stdout。由于只有一个标准输出,我们不妨将其设为单例:/** Beware: Not good for serializing! */
class StdoutStringSink {
public static final StdoutStringSink INSTANCE = new StdoutStringSink();
private StdoutStringSink(){}
@Override
public void dump(String s){ System.out.println(s); }
}
我们这样使用它:
MultiDumper dumper = new MultiDumper(StdoutStringSink.INSTANCE);
如果要序列化然后反序列化此转储程序,则程序中将有两个
StdoutStringSink
实例浮动。