Initialization On Demand Holder 成语

Initialization On Demand Holder idiom

这是网络上最常看到的实现方式

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 中不能有静态局部变量。

更简单的选择是

private static final Something something = new Something();

public static Something getInstance() {
  return something;
}

或者我的偏好。

enum Something {
    INSTANCE;
}

这些模式的唯一问题是,如果您有多个要延迟加载的实例,则每个实例都需要 class,否则加载一个就意味着加载所有实例。

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

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