web-dev-qa-db-ja.com

Java列挙型ベースのシングルトンを初期化する方法は?

オブジェクトを使用する前に初期化する必要がある場合、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"));
    }

}
17
java_mouse

enumのコンストラクターを作成することは完全に可能です。

public enum BitCheck {

    INSTANCE;

    BitCheck() {
        props = new HashMap<String, String>();
    }

    private final Map<String, String> props;

    //..

}

ご了承ください:

  • propsフィールドはfinalにすることができます(finalが好きです)
  • propsstaticである必要はありません
  • コンストラクターは自動的にそして熱心に呼び出されます

最後の点に注意してください。 enum-シングルトンは、enum BitCheckクラスがロードされているため、コンストラクターに引数を渡す方法はありません。もちろん、INSTANCE宣言を介して行うことができます。

public enum BitCheck {

    INSTANCE(new HashMap<String, String>());

    BitCheck(final Map<String, String> props) {
        this.props = props;
    }

でもこれは何の違いもありませんよね?何を達成したいですか?たぶん、あなたは実際に怠惰に初期化されたシングルトンが必要ですか?

33

宣言で初期化する必要があります。

public enum BitCheck {
    INSTANCE;
    private final Map<String, String> props = new ConcurrentHashMap<String, String>();

    public void putAll(HashMap<String, String> map) {
        props.putAll(map);
    }
}
5
Amit Deshpande

次のようなコンストラクターを定義する必要があります。

public enum BitCheck {

    INSTANCE;
    private final HashMap<String, String> props;

    BitCheck() {

    }
}

非常に良い例は、次の惑星列挙型です。 http://docs.Oracle.com/javase/tutorial/Java/javaOO/enum.html

2
Jordan Denison
public enum BitCheck {

    INSTANCE;

    private BitCheck() {
        // initialize here
    }

}
1
devang

インターフェイスに実装する必要があるため、次のように変更する必要があります。

private Map<...> props;

あなたは見ることができます Javaで列挙型をシングルトンとして使用するための最良のアプローチは何ですか? これはあなたが望むものに似ています。

1
ramsinb

列挙型ベースのシングルトンコード内でこのようなことを試すことができます。これにより、シングルトンを1回だけ初期化できるようになります。

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に2つのAtomicBooleanが必要になります(単一のAtomicBoolean-isInitializedの代わりに)。次に、最初のスレッドがinitStartedを設定して初期化ステップを実行し、残りは最初のスレッドによってinitCompletedがtrueに設定されるまで待機します。

0
janeshs