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

标签 java enums 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(我们喜欢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;
    }

但这没有任何区别,对吧?你想达到什么目的?也许您实际上需要延迟初始化的单例?

关于java - 如何初始化基于 Java 枚举的 Singleton?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12697726/

相关文章:

java - 获取枚举下变量的值

java - 比较枚举值时出现 "unexpected type"错误

c++ - 无法在初始化时转换匿名枚举

singleton - EJB 3.1 : Singleton bean not getting injected inside another stateless bean though both beans are getting registered

java - DCL 还坏吗?

java - Eclipse 中的 OpenCV 3.0.0 java.lang.UnsatisfiedLinkError

java - 如何从ArrayList中获取Point值

C++:在类内、类外应用枚举

javascript - 有什么方法可以防止在单例实例中覆盖/覆盖函数/变量?

java - 如何将 xlsx 文件转换为 csv?