2013-06-11 30 views
5

這個問題幾乎不言自明。我有一個數據結構(我提到一個HashMap,但它可能是一組或一列表也),我最初填充:結構已被填充如何凍結HashMap以防止進一步的更改?

Map<String, String> map = new HashMap<String, String>(); 

for(something) { 
    map.put(something); 
} 

之後,我從來沒有想添加或刪除的任何項目:

map.freeze(); 

如何使用標準Java庫實現這一目標?

+0

如果你總是在初始化後直接填充它,爲什麼不使用靜態初始化呢? [這裏](http://stackoverflow.com/questions/507602/how-to-initialise-a-static-map-in-java)是如何做到這一點的一個很好的例子。 – colti

回答

17

使用標準JDK庫可以做的最好的事情是Collections.unmodifiableMap()

請注意,您需要必須刪除原始地圖參考,因爲該參考仍然可以正常訪問和更改。如果您將舊引用傳遞給任何其他對象,它們仍然可以更改您的地圖。

最佳實踐:

map = Collections.unmodifiableMap(map); 

,並確保你不同意原map參考。

+4

不完全正確。如果您擔心有人可能會改變原始地圖,則可以對其進行防禦性複製。 'map - Collections.unmodifiableMap(new HashMap (map));'當然,這仍然留下地圖中的任何對象是否都是可變的問題。 –

3

將它包裝在一個類中並使其不可變。例如:

public class ImmutableMapWrapper { 

    private Map<String, String> map = new HashMap<String, String>(); 

    public ImmutableMapWrapper() { 
     for(something) { 
      this.map.put(something); 
     } 
    } 
} 
0

創建一個不變的HashMap:

HashMap <MyKey, MyValue> unmodifiableMap = Collections.unmodifiableMap(modifiableMap); 

的JavaDoc here

此外,我認爲Google數據收集工具(Guava ???)已經有一個ImmutableMap類型。

7

這聽起來像你會用番石榴的ImmutableMap做得很好。它允許使用Builder模式來組裝和「凍結」。

+1

如果您可以使用第三方庫,這是最好的解決方案。 –

+5

是的,但問題是:*如何使用**標準Java庫**實現此目標?* – arshajii

+6

有時您想要的答案不是您需要的答案。 – Deadron