【问题标题】:Using private static nested class to implement Singleton使用私有静态嵌套类实现单例
【发布时间】:2015-04-01 15:40:40
【问题描述】:

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

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

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

问题:这个实现是否有效? (我认为确实如此,但我不能确定。)如果确实如此,使用此实现是否有任何优点或缺点?

【问题讨论】:

  • Singleton 是私人的!
  • "这个实现有效吗?"你试过了吗?
  • @fabian 应该是
  • 对单例使用枚举,但不要使用单例
  • 您能告诉我们您的实施有哪些优势吗?为什么你认为它比其他方法更好?否则我在这里看不到问题..

标签: java design-patterns


【解决方案1】:

它是一个单例,但它被急切地初始化(不是延迟初始化),所以它不是那么有趣。您使用名称 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
}

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

【讨论】:

  • when first got vs 而不是加载类时实际上只是一种更深入的方法调用(除非您使用的是Singleton类别的)。
  • @SotiriosDelimanolis 不完全;对类的任何引用(即导入)都是在加载类时,这可能是在它使用之前的几个小时。例如,您的控制器可能会出现,但很久没有人调用它了。
  • import 语句在运行时不执行任何操作。
  • @SotiriosDelimanolis 我的意思是如果 A 类引用 - 即 使用 - B 类,则在加载 A 类时加载 B 类。这意味着 OP 的单例可能会在 JVM 启动时初始化
  • 使用定义为here。如果唯一的用途是调用getInstance,那么使用您的解决方案和使用OP 问题中提供的解决方案(减去private)基本上是相同的。
【解决方案2】:

这行不通,因为您的 Singleton 课程是私有的。这意味着您无法从 SWrapper 外部访问它的成员(当然,Object 中定义的成员除外)。

【讨论】:

    【解决方案3】:

    公共类 SingletonWithHelper {

    private SingletonWithHelper(){}
    
    //This is the most widely used approach for Singleton class as it doesn’t
    //require synchronization.
    private static class SingletonHelper{
        private static final SingletonWithHelper SINGLETON = new SingletonWithHelper();
    }
    
    public static SingletonWithHelper getInstance(){
        return SingletonHelper.SINGLETON;
    }
    

    }

    【讨论】:

      猜你喜欢
      • 2011-10-23
      • 1970-01-01
      • 1970-01-01
      • 2016-01-05
      • 1970-01-01
      • 1970-01-01
      • 2015-02-18
      • 2014-08-30
      • 2015-03-01
      相关资源
      最近更新 更多