2012-03-01 47 views
0

我有一個類,我想有static final變量。用於Spring的靜態最終替代方案DI

public static final Map<String, Long> ID_MAP; 

我希望能夠通過Spring注入地圖。這不能做到B/C它是一個static final。我的選擇是將其聲明爲static並使用Spring與setter。像

public void setIDMapSpring (long iDMapSpring){ 
    ID_MAP = iDMapSpring; 

但是,這意味着另一個類可以改變的價值。有沒有我可以嘗試的替代方案。我正在考慮將Singleton與Map一起作爲final字段,但我仍然需要弄清楚如何將Map以及其他可能的變量(我想標記爲final)傳遞給getInstance方法。另外,我很難找到最簡單,最不復雜的解決方案。

+0

最簡單和最不復雜的解決方案是使地圖不是最終的。從某種意義上說,它實際上並不是最終的,因爲它在運行時發生了變化。 – pap 2012-03-02 08:25:38

回答

3

使地圖成爲一個字段並注入單例。

+0

班會是單身人士還是地圖? '公共類SingletonID {Map map;私人靜態getInstance(地圖 aMap){if(theInstance == null)etc ..' – Alessandro 2012-03-01 18:10:19

+0

該地圖將是單身人士。這就是使它成爲靜態字段的真正含義:「只有一個這樣的地圖」 – 2012-03-01 18:21:28

+0

這是否涉及在我的班級中使用'getBean(「mapSingleton」)'或類似的東西?我問的原因是B/C我正在使用GWT,這將是一個共享類,這意味着外部罐子不能使用,因爲它都被GWT轉換爲javaScript。我知道spring bean默認是singleton,我不知道如何在不使用類外部庫的情況下使地圖成爲singleton。 – Alessandro 2012-03-01 19:08:39

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"); 
} 

還有其他方法可以做到這一點。無論如何,您可能都希望使用線程安全形式的保護。