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();
    }
}