如何初始化基于Java枚举的单例?

2022-09-02 08:53:02

初始化基于java枚举的单例的正确方法是什么,如果我必须在使用对象之前对其进行初始化。

我已经开始编写代码,但我不确定我是否做对了。你能帮我为我实现这个单例正确吗?

public enum BitCheck {

    INSTANCE;

    private static HashMap<String, String> props = null;

    public synchronized void  initialize(HashMap<String, String> properties) {
        if(props == null) {
            props = properties;
        }
    }

    public boolean isAenabled(){
        return "Y".equalsIgnoreCase(props.get("A_ENABLED"));
    }

    public boolean isBenabled(){
        return "Y".equalsIgnoreCase(props.get("B_ENABLED"));
    }

}

答案 1

完全有可能为以下各项创建构造函数:enum

public enum BitCheck {

    INSTANCE;

    BitCheck() {
        props = new HashMap<String, String>();
    }

    private final Map<String, String> props;

    //..

}

请注意:

  • props字段可以是最终的(我们喜欢final)
  • props不必是static
  • 构造函数会自动调用,并热切地为您调用

注意最后一点。由于 -singletons 是在加载类时预先创建的,因此您无法将任何参数传递给构造函数。当然可以通过声明:enumenum BitCheckINSTANCE

public enum BitCheck {

    INSTANCE(new HashMap<String, String>());

    BitCheck(final Map<String, String> props) {
        this.props = props;
    }

但这没有任何区别,对吧?您想实现什么目标?也许你真的需要懒惰初始化的单例?


答案 2

您只需要在声明中初始化它。

public enum BitCheck {
    INSTANCE;
    private final Map<String, String> props = new ConcurrentHashMap<String, String>();

    public void putAll(HashMap<String, String> map) {
        props.putAll(map);
    }
}

推荐