[英]How to initialize Java enum based Singleton?
如果我必須在使用該對象之前初始化它,那么初始化基於java enum的單例的正確方法是什么。
我已經開始編寫代碼,但我不確定我是否做得對。 你能幫我實現這個單身對我來說正確嗎?
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;
}
但這沒有任何區別,對吧? 你想達到什么目的? 也許你真的需要懶惰初始化的單身人士?
你必須在聲明中初始化它。
public enum BitCheck {
INSTANCE;
private final Map<String, String> props = new ConcurrentHashMap<String, String>();
public void putAll(HashMap<String, String> map) {
props.putAll(map);
}
}
你需要定義一個這樣的構造函數:
public enum BitCheck {
INSTANCE;
private final HashMap<String, String> props;
BitCheck() {
}
}
一個很好的例子是Planet enum: http : //docs.oracle.com/javase/tutorial/java/javaOO/enum.html
public enum BitCheck {
INSTANCE;
private BitCheck() {
// initialize here
}
}
你可以在基於枚舉的單例代碼中嘗試這樣的東西。 這將確保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。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.