java - 单例设计模式实现

标签 java design-patterns singleton

我看到了 Singleton 类的不同实现。然而,这个特定的实现:https://sourcemaking.com/design_patterns/singleton/java/1 不在私有(private)构造函数中创建对象。

有人可以解释一下,这两种实现之间的优点或缺点是什么?给出的描述很少,我还没有从中理解太多。

谢谢。

最佳答案

您提供的链接解释得很好,如果简洁的话......但让我尝试扩展......

The inner class is referenced no earlier (and therefore loaded no earlier by the class loader) than the moment that getInstance() is called.

这是解释中最重要的部分。

上面提到的内部类是 SingletonHolder 类,它的存在只是为了保存 Singleton 的实例。

因为这个类是私有(private)的并且没有在其他任何地方引用,所以保证这个类不会被初始化(由Java ClassLoader加载),直到Singleton的getInstance()方法 被调用,因为这是 JVM 初始化该类所需的最早时间。

初始化类时,它包含的任何静态最终字段(和静态 block )都会在该类可供任何用户代码使用之前进行初始化。此初始化是线程安全的,因此使用此模式的代码不需要任何通常在 Java 中单例模式的其他实现中发现的复杂同步逻辑。

参见this question有关替代实现的更多讨论,包括基于 enum 的解决方案以及更复杂、显式同步的 Singleton 版本。

请注意,如果您不关心使单例延迟加载(即仅在需要时初始化),则只需使用最简单的方法:

class Singleton {
    public static final INSTANCE = new Singleton();
    private Singleton() { /* cannot be instantiated externally */ }
}

关于java - 单例设计模式实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37080807/

相关文章:

java - 在 Maven、Eclipse、Glassfish 中自动部署更改的 Java 代码

java - 通过属性文件的 Restful url

java - java中从多个表检索数据时的最佳设计原则

c# - 在单例上使用 Dispose 来清理资源

php - Laravel 5 中的单例类

java - 如果线程不会自行停止,如何停止它?

java - 是否可以使用特定的 NodeRef 在露天创建一个节点?

c# - 我应该在 C# 中使用异常来强制执行基类兼容性吗?

c# - 具有相同方法的多个类 - 最佳模式

c++ - 谷歌模拟单例 C++ 类