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

如果我必须在使用该对象之前初始化它,那么初始化基于java enum的单例的正确方法是什么。

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

public enum BitCheck { INSTANCE; private static HashMap props = null; public synchronized void initialize(HashMap 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(); } private final Map props; //.. } 

注意:

  • props领域可以是最终的(我们喜欢final
  • props不一定是static
  • 构造函数会自动为您而急切地调用

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

 public enum BitCheck { INSTANCE(new HashMap()); BitCheck(final Map props) { this.props = props; } 

但这没有任何区别,对吧? 你想达到什么目的? 也许你真的需要懒惰初始化的单身人士?

你必须在声明中初始化它。

 public enum BitCheck { INSTANCE; private final Map props = new ConcurrentHashMap(); public void putAll(HashMap map) { props.putAll(map); } } 

你需要定义一个这样的构造函数:

 public enum BitCheck { INSTANCE; private final HashMap props; BitCheck() { } } 

一个很好的例子是Planet enum: http : //docs.oracle.com/javase/tutorial/java/javaOO/enum.html

 public enum BitCheck { INSTANCE; private BitCheck() { // initialize here } } 

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

 private Map<...> props; 

您可以看一下在Java中使用Enum作为单例的最佳方法是什么? 这与你想要的类似。

你可以在基于枚举的单例代码中尝试这样的东西。 这将确保Singleton只能初始化一次。

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

注意:对于更复杂的初始化,您需要2个AtomicBooleans用于initStarted和initCompleted(而不是单个AtomicBoolean – isInitialized)。 然后第一个线程设置initStarted并执行初始化步骤,其余的等待,直到第一个线程将initCompleted设置为true。