2012-10-02 6 views
14

Java Enumベースのシングルトンを初期化する適切な方法は、オブジェクトを使用する前に初期化する必要がある場合です。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")); 
    } 

} 
+0

私はこれが好きではありません、あなたは何を達成しようとしていますか? – zengr

+0

シングルトンを使用しているときに、なぜ要素が1つしかない列挙型が必要なのですか? – Dunes

+0

@Dunesシングルトンを使用して、コードベース全体でこれを使用して値をチェックすることができます。私は起動時にプロパティで初期化し、プロジェクト全体でチェックメソッドを使用します。 –

答えて

30

それはenumのコンストラクタを作成するために完全に可能です。ということ

public enum BitCheck { 

    INSTANCE; 

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

    private final Map<String, String> props; 

    //.. 

} 

注:

  • propsフィールドがfinal可能に(私たちはfinalが好き)
  • propsありませんになる。static
  • コンストラクタは自動的かつ熱心に呼び出されます

最後の点に注意してください。 enumクラスは、enum BitCheckクラスがロードされたときに熱心に作成されるので、コンストラクタに引数を渡す方法はありません。

public enum BitCheck { 

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

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

は、これは右、任意の違いはありません。もちろん、INSTANCE宣言を介しことができますか?あなたは何を達成したいですか?たぶん、実際には遅延初期化シングルトンが必要でしょうか?

+0

私はそれがコンストラクタが良いものを提供していないので、このように作成することは悪いアイデアだろうと思います。それは単純な宣言にすることができます –

+0

私は値のセットで初期化したい、それをシングルトンに渡したいと思います。どうやってやるの?あなたの例は空のハッシュマップで初期化されています。 –

+1

@ java_mouse:それが問題です。外部からコンストラクタに何かを渡す方法はありません。「enum」シングルトンはあなたを助けません。 –

1
public enum BitCheck { 

    INSTANCE; 

    private BitCheck() { 
     // initialize here 
    } 

} 
5

宣言でこれを初期化するだけです。

+0

+1、どうにかして 'props'を同期させるべきです。 –

+0

ありがとうございました。 –

0

Enumベースのシングルトンコード内で、このようなことを試すことができます。これにより、シングルトンを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; 
    } 
} 

注:より複雑な初期化のために、あなたが(代わりに、単一のAtomicBooleanの - isInitialized)initStartedとinitCompletedのための2 AtomicBooleansが必要になります。最初のスレッドはinitStartedを設定して初期化ステップを実行し、残りはinitCompletedが最初のスレッドによってtrueに設定されるまで待機します。

関連する問題