【问题标题】:Initialization On Demand Holder idiom按需初始化持有者成语
【发布时间】:2016-06-03 17:55:12
【问题描述】:

这是网络上最常见的实现

private static class LazySomethingHolder {
  public static Something something = new Something();
}

public static Something getInstance() {
  return LazySomethingHolder.something;
}

以下更简单的变体是否正确,如果不是,它有什么问题?问题是 java 特有的还是 C++ 中也存在?

public static Something getInstance() {
  private static Something something = new Something();
  return something;
}

【问题讨论】:

    标签: java c++ static singleton lazy-initialization


    【解决方案1】:

    Java 中不能有静态局部变量。

    更简单的选择是

    private static final Something something = new Something();
    
    public static Something getInstance() {
      return something;
    }
    

    或者我的偏好。

    enum Something {
        INSTANCE;
    }
    

    这些模式的唯一问题是,如果您想要延迟加载多个实例,则每个实例都需要一个类,否则加载一个将意味着全部加载。

    【讨论】:

    • "你可以在 Java 的方法中包含静态字段。"这里有错别字
    【解决方案2】:

    Java(与 c++ 不同)没有局部静态变量,因此您所描述的根本不可能。在 c++ 中,您很可能会编写(称为 meyer singleton):

    public static Something& getInstance() {
        static Something something{};
        return something;
    }
    

    【讨论】:

    • something{} 这是做什么的?我第一次看到它。
    • @q126y:默认初始化something。如果某事是一个类,你也可以省略它。
    • @q126y:它是c++11以来c++的一部分,被称为统一初始化语法。
    猜你喜欢
    • 2014-11-25
    • 1970-01-01
    • 2018-09-08
    • 1970-01-01
    • 1970-01-01
    • 2014-01-26
    • 1970-01-01
    • 1970-01-01
    • 2017-08-16
    相关资源
    最近更新 更多