单一实例化和"static"代码在什么时候发生



我有两个有关单身班的问题:

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

最新更新