我们一直在阅读有关如何使用'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实例浮动。

10-04 11:39