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

如何初始化基于Java枚举的单例?,java,enums,singleton,Java,Enums,Singleton,如果在使用对象之前必须初始化基于java枚举的单例,那么初始化它的正确方法是什么 我已经开始编写代码,但我不确定我是否做对了。你能帮我实现这个单件更正吗 public enum BitCheck { INSTANCE; private static HashMap<String, String> props = null; public synchronized void initialize(HashMap<String, String>

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

}
公共枚举位检查{
实例;
私有静态HashMap props=null;
公共同步的void初始化(HashMap属性){
if(props==null){
道具=财产;
}
}
公共布尔值已启用(){
返回“Y”.equalsIgnoreCase(props.get(“A_ENABLED”);
}
公共布尔值isBenabled(){
返回Y.equalsIgnoreCase(props.get(“B_ENABLED”);
}
}

完全可以为
枚举创建构造函数:

public enum BitCheck {

    INSTANCE;

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

    private final Map<String, String> props;

    //..

}

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

您需要定义如下的构造函数:

public enum BitCheck {

    INSTANCE;
    private final HashMap<String, String> props;

    BitCheck() {

    }
}
公共枚举位检查{
实例;
私有最终HashMap道具;
比特校验(){
}
}

一个很好的例子是Planet enum,位于:

您应该实现到接口,因此更改为:

private Map<...> props;
私人地图道具;

您可以查看与所需内容类似的内容。

您只需在声明中对其进行初始化即可

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

    public void putAll(HashMap<String, String> map) {
        props.putAll(map);
    }
}
公共枚举位检查{
实例;
private final Map props=新的ConcurrentHashMap();
公共void putAll(HashMap映射){
道具。putAll(地图);
}
}

您可以在基于枚举的单例代码中尝试类似的操作。这将确保单例可以被初始化一次

private static Properties props;
private static AtomicBoolean isInitialized = new AtomicBoolean(false);

public void init(Properties props){
   if(isInitialized.compareAndSet(false, true)) {
       this.props = props;
   }
}

注意:对于更复杂的初始化,initStarted和initCompleted需要两个AtomicBoolean(而不是单个AtomicBoolean-isInitialized)。然后第一个线程设置initstart并执行初始化步骤,其余线程等待initCompleted被第一个线程设置为true。

我不喜欢这样,您想要实现什么?为什么您已经在使用单例时只需要一个元素的枚举?@Dunes我想要一个单例,这样我就可以在整个代码库中使用它来检查值。我将在启动期间使用属性进行初始化,并在整个项目中使用检查方法。我理解为什么您可能需要单例,但同时使其成为枚举似乎很奇怪。@Dunes请阅读此问题,了解有关将枚举用作单例的一些启示:。我想这样创建是个坏主意,因为构造函数不提供任何好的东西。它可以是简单的声明,我想用一组值初始化它,我想把它传递给singleton。我该怎么做?您的示例正在使用空hashmap进行初始化。@java\u mouse:就是这样。无法从外部将任何内容传递给构造函数,
enum
singleton对您没有帮助。@TomaszNurkiewicz谢谢,我想我知道了。我应该选择传统的单例实现。我不知道复杂的初始化到底是什么意思,为什么我们需要两个原子布尔。如果我错了,请纠正我,但我认为只要我在该“if”块中拥有所有初始化代码(不管有多少步骤),上述代码就可以正常工作。
public enum BitCheck {
    INSTANCE;
    private final Map<String, String> props = new ConcurrentHashMap<String, String>();

    public void putAll(HashMap<String, String> map) {
        props.putAll(map);
    }
}
private static Properties props;
private static AtomicBoolean isInitialized = new AtomicBoolean(false);

public void init(Properties props){
   if(isInitialized.compareAndSet(false, true)) {
       this.props = props;
   }
}