初始化按需持有人习语

时间:2016-02-22 10:34:32

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

这是主要在网上看到的实施

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;
}

2 个答案:

答案 0 :(得分:1)

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

更简单的替代方案

private static final Something something = new Something();

public static Something getInstance() {
  return something;
}

或我的偏好,如果是。

enum Something {
    INSTANCE;
}

这些模式的唯一问题是,如果你想要延迟加载多个实例,你需要每个都有一个类,或者加载一个将意味着加载它们。

答案 1 :(得分:1)

Java(与c ++不同)没有本地静态变量,因此您所描述的内容根本不可能。在c ++中你最有可能写(称为meyer singleton):

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