java - 使用私有(private)静态嵌套类实现Singleton

标签 java design-patterns

我目前正在学习单例模式。我了解到实现它的经典方法是创建 Singleton 类类型的静态字段,使用私有(private)访问修饰符隐藏构造函数,并提供公共(public) getInstance() 方法。

但是,我想到了另一种不使用私有(private)构造函数来实现它的方法:

public class SWrapper {
    private static Singleton holder = new Singleton();
    private static class Singleton{ /* implementation without private constructor*/}
    public static Singleton getInstance() {
        return holder;
}

问题:此实现有效吗? (我认为确实如此,但我不能确定。)如果确实如此,使用此实现有什么优点或缺点?

最佳答案

它是一个单例,但它是急切初始化的(而不是延迟初始化的),所以它不是那么有趣。您使用的名称 holder 表明您正在尝试 Initialization-on-demand holder idiom :

public class Singleton {
    private static class Holder {
        static final Singleton INSTANCE = new Singleton ();
    }

    public static Singleton getInstance() {
        return Holder.INSTANCE;
    }

    private Singleton () {
    }
    // rest of class omitted
}

它在第一次获取时(而不是在类加载时)初始化单例实例,但不需要任何特殊的同步来保证线程安全。

关于java - 使用私有(private)静态嵌套类实现Singleton,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29395108/

相关文章:

java - 在实现维吉尼亚密码方面需要帮助

java - 在 Spring MVC + Hibernate 应用程序中的某个类中获取方言

java - 有条件包含元素的生成器

c++ - 特定子类的装饰器

java - 如果无代码 : is it just an intellectual challenge or is it concretely useful?

objective-c - NSThread 和对象保留计数问题

java - Mysql 将用户表与其他表连接起来

java - Android Studio 未找到主要 Activity

java - 验证简单 for/lambda 比较的 JMH 测量

algorithm - 在代码中实现常见白皮书数学习语的常用方法有哪些