如何初始化基于Java枚举的单例?
如果在使用对象之前必须初始化基于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>
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;
}
}