我有两个有关单身班的问题:
1)通过声明中的"新",该实例在代码的什么时候被调用?这是第一次被称为getInstance()吗?
2)在代码的什么时候发生" static {..}"哈希图初始化?
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;
}
}
静态变量和静态块在jvm首先加载时一次调用一次(代码中的类的第一个调用)。
声明的顺序定义了加载顺序。
class加载的那一刻(通常是第一次引用某个地方的某个地方时)。
)。所有静态成员都将启动,所有静态块将被执行。这是从班级的顶部到底部的。
因此,当调用getInstance()时,不是。它发生的时间早。
与 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();
}
}