构造函数中的一类静态方法

Den*_*er8 4 java constructor hashmap static-constructor

我有一类可以在类中保存的地图上执行的静态方法,我希望在调用类时设置地图.我尝试过使用私有的构造函数,但它没有被调用.我的代码的相关部分是:

public class MyClass
{
    private static final String KEYS = "ABC";
    private static final String[] DATA = {"AAA", "BBB", "CCC"};
    private static HashMap<Character, String> myMap;

    private MyClass() {
        System.out.println("Running constructor");
        populateMyMap();
    }

    private static void populateMyMap() {
        myMap = new HashMap<Character, String>();
        for (int i=0; i < KEYS.length; i++) {
            myMap.put(KEYS.charAt(i), DATA[i]);
        }
    }

    //various static methods
}
Run Code Online (Sandbox Code Playgroud)

私有构造函数是否适合在这里使用,如果是这样,我做错了什么?

对不起,如果这是重复的; 我试过寻找答案,但我不确定要搜索什么!

Mar*_*ers 8

不,私有构造函数不是你想要的.构造函数初始化类的实例(在调用时new MyClass()),但静态不属于实例,因此不应从构造函数初始化.首次加载类时要进行的初始化应该static位于类级别的块中.

static {
   populateMyMap();
}
Run Code Online (Sandbox Code Playgroud)

但是你永远不应该使用静态(全局)状态.静态使您的系统难以测试,它比实例状态更细微(例如,每个类的负载有一个副本)并且通常更难使线程安全.

考虑让您的地图成为您班级的实例成员.


A.H*_*.H. 5

在其他几个答案中已经提到了静态初始化程序块.但实际上我在野外更频繁地发现以下习语:

public class MyClass
{
    private static HashMap<Character, String> myMap = createMyMap();

    private static HashMap<Character, String> createMyMap() {
        HashMap<Character, String> myTmpMap = new HashMap<Character, String>();
        for (int i=0; i < KEYS.length; i++) {
            myTmpMap.put(KEYS.charAt(i), DATA[i]);
        }
        return myTmpMap;
    }
}
Run Code Online (Sandbox Code Playgroud)