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;
}
这是网络上最常看到的实现方式
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;
}