オブジェクトを使用する前に初期化する必要がある場合、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にすることができます(final
が好きです)props
はstatic
である必要はありません最後の点に注意してください。 enum
-シングルトンは、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() {
}
}
非常に良い例は、次の惑星列挙型です。 http://docs.Oracle.com/javase/tutorial/Java/javaOO/enum.html
public enum BitCheck {
INSTANCE;
private BitCheck() {
// initialize here
}
}
インターフェイスに実装する必要があるため、次のように変更する必要があります。
private Map<...> props;
あなたは見ることができます Javaで列挙型をシングルトンとして使用するための最良のアプローチは何ですか? これはあなたが望むものに似ています。
列挙型ベースのシングルトンコード内でこのようなことを試すことができます。これにより、シングルトンを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に設定されるまで待機します。