2012-03-01 11 views
0

私には、static finalという変数が必要なクラスがあります。Spring DIで使用するJavaの静的最終選択肢

public static final Map<String, Long> ID_MAP; 

私は、Springを介してマップを注入できるようにしたかったのです。これはできませんb/cそれはstatic finalです。私の代わりにstaticと宣言し、セッターでSpringを使用しました。何かのように

これは、別のクラスが値を変更することができることを意味します。私が試すことができる選択肢はありますか?私はマップを持つシングルトンをfinalフィールドとして考えていましたが、私はまだマップを渡す方法と、finalというマークが付いた他の変数をgetInstanceメソッドに渡す方法を見つけました。また、私は、最もシンプルで複雑なソリューションを探すのに苦労しています。

+0

最も単純で複雑な解決策は、マップを非最終的にすることです。ある意味では、実行時に変更されているので、実際には最終的に最終的なものではありません。 – pap

答えて

3

マップをフィールドにしてシングルトンを挿入します。

+0

クラスはシングルトンか地図か? 'public class SingletonID {マップマップ; private static getInstance(マップ aMap){if(theInstance == null)など。 – Alessandro

+0

マップはシングルトンになります。これは静的なフィールドを実際に意味するものです:「このようなマップは1つしかありません」 –

+0

これは、私のクラスで 'getBean(" mapSingleton ")'などを使用することになりますか?私が尋ねる理由はb/cです.GWTを使用しています。これは共有クラスになります。つまり、GWTによってすべてがJavaScriptに変換されるため、外部のjarファイルを使用できません。私は春の豆がデフォルトではシングルトンであることを知っています。クラス内の外部ライブラリを使用せずにマップをシングルトンにする方法は他にありません。 – Alessandro

0

Springがそれを設定した後に値を変更する外部クラスが気になる場合は、フィールドを一度しか設定できないようにクラスにフラグを組み込むことができます。 「CAN_SET_ID_MAP」という静的なAtomicBooleanをtrueに初期化したとします。地図作成者:

if (CAN_SET_ID_MAP.compareAndSet (true, false)) { 
    ID_MAP = iDMapSpring; 
} else { 
    throw new IllegalStateException ("ID_MAP already set"); 
} 

その他の方法があります。スレッド保護された形の保護を使用したいと思うかもしれません。

関連する問題