如何初始化基于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;
}
但这没什么关系吧?您想实现什么?也许您实际上需要延迟初始化的单例?