避免 Singleton 的多个实例? [复制]

Posted

技术标签:

【中文标题】避免 Singleton 的多个实例? [复制]【英文标题】:Avoid multiple instances of Singleton? [duplicate] 【发布时间】:2014-08-11 16:30:57 【问题描述】:

我相信,当一个单例对象被序列化,然后在多次连续反序列化时,就会创建多个单例实例。

如何避免这种情况?

【问题讨论】:

这里的“scala”标签有什么意义? 【参考方案1】:

通常,当您创建一个 Singleton 时,您要确保它只有一个实例。你可以这样做:

public static class Singleton
    private final static Singleton instance;

    private Singleton()

    public static Singleton getInstance()
        if(instance == null)
            instance = new Singleton();
        return instance;
    



将构造函数放入private 确保除了这个类之外没有人可以创建Singleton 的实例。

您只需要使用 getInstance 调用 Singleton,Singleton 就可以完成所有工作。

【讨论】:

最好将类 final 和构造函数设为私有,这样任何人都无法创建允许创建其他 Singleton 类型的对象的子类。 @Arkanon 谢谢!我做了更改。 另外,Singleton instance 应该是静态的。 @TyMarc - 很好的解释+答案,谢谢! 我认为这个答案不能解决序列化/反序列化问题【参考方案2】:

Joshua Bloch 在Effective Java 中谈到了使用枚举作为单例来避免这个特定问题。查看这篇文章:Why Enums are Better Singletons - 或 - 直接从 Bloch here 阅读。

【讨论】:

+1 来自我。很好的参考/链接。 枚举需要更多内存,见youtube.com/watch?v=Hzs6OBcvNQE 那个视频是安卓专用的,就是2K和4K字节的区别…………

以上是关于避免 Singleton 的多个实例? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

Java设计模式之单例设计模式(Singleton)

Singleton模式(设计模式)

Singleton模式(设计模式)

Laravel容器返回多个Singleton实例

Singleton类的优势是啥? [复制]

ACE_TAO 010 单例模式(Singleton设计模式)