Singleton 实例化和 "static" 代码在什么时候发生
At what point does the Singleton instantiation and "static" Code Occur
我有两个关于单例的问题 class 下面:
1) 通过声明中的 "new" 在代码中的什么位置调用实例?这是 第一次调用 getInstance() 吗?
2) "static {..}" 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;
}
}
这两个都是在 class 加载时执行的(因此通常是在 class 第一次在某处被引用时)。
将启动所有静态成员并执行所有静态块。这发生在 class 的顶部到底部。
所以不是调用getInstance()的时候。它发生得比那早。
静态变量和静态块在 JVM 首次加载 class 时被调用一次(在代码中首次调用您的 class)。
声明的顺序定义了加载的顺序。
和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();
}
}
我有两个关于单例的问题 class 下面:
1) 通过声明中的 "new" 在代码中的什么位置调用实例?这是 第一次调用 getInstance() 吗?
2) "static {..}" 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;
}
}
这两个都是在 class 加载时执行的(因此通常是在 class 第一次在某处被引用时)。
将启动所有静态成员并执行所有静态块。这发生在 class 的顶部到底部。
所以不是调用getInstance()的时候。它发生得比那早。
静态变量和静态块在 JVM 首次加载 class 时被调用一次(在代码中首次调用您的 class)。
声明的顺序定义了加载的顺序。
和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();
}
}