我对下面的Singleton类有两个问题:
1)在代码中的什么位置调用实例,通过" new"在声明中?是第一次调用getInstance()吗?
2)在代码的什么位置,"静态{..}" HashMap初始化发生了吗?
public class Factory {
// Singleton Member Defined - when does this New instantiation occur
private static final Factory instance = new Factory();
// Additional Map Variable
private static HashMap<String, String> myMap = new HashMap<String, String>();
static {
myMap.put("key1", "value1");
myMap.put("key2", "value2");
}
// Private Constructor for Singleton
private Factory() {
}
// Get Singleton Instance
public Factory getInstance() {
return instance;
}
}
答案 0 :(得分:1)
当JVM首次加载类时,会调用静态变量和静态块(在代码中首次调用类)。
声明的顺序定义了加载的顺序。
答案 1 :(得分:0)
这两个都是在类加载的那一刻执行的(所以通常是第一次在某处引用类时)。
将启动所有静态成员并执行所有静态块。这发生在从班级的顶部到底部。
所以不是在调用getInstance()时。它发生的时间早于此。
答案 2 :(得分:0)
与Medhi Redjem
所说的相同......
但是您的代码需要创建一个实例来获取类似的实例:
Factory factory = new Factory().getInstance();
通常getInstance方法不能像那样工作
试试这段代码:
import java.util.HashMap;
public class Factory {
private static final HashMap<String, String> myMap = new HashMap<>();
static {
myMap.put("key2", "value2");
myMap.put("key1", "value1");
}
private Factory() {
}
public static Factory getInstance() {
return new Factory();
}
public static void main(String[] args) {
Factory factory = Factory.getInstance();
}
}