簡體   English   中英

如何初始化基於Java枚舉的Singleton?

[英]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
    }

}

您應該實現接口,因此更改為:

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。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM