Singleton实例化和"静态"代码发生

时间:2015-05-12 17:48:11

标签: java singleton

我对下面的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;
    }

}

3 个答案:

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