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


问题内容

如果必须在使用该对象之前对其进行初始化,那么初始化基于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"));
    }

}

问题答案:

完全有可能为以下对象创建构造函数enum

public enum BitCheck {

    INSTANCE;

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

    private final Map<String, String> props;

    //..

}

注意:

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

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

public enum BitCheck {

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

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

但这没什么关系吧?您想实现什么?也许您实际上需要延迟初始化的单例?