2012-08-31 57 views
11

靜態初始化可修改Maps的最佳方式是什麼?我發現只有在Google集合中靜態初始化Maps的最佳方式

ImmutableMap.of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5) 

但是,這種方式創建不可變的映射,幷包含固定的參數列表。

+0

相關 - http://stackoverflow.com/questions/5947869/like-immutablemap-of-for-hashmap-in-maps – Premraj

回答

20

如果你想一個of代碼的方式,你可以使用:

myMap = Maps.newHashMap(ImmutableMap.of(k1, v1, k2, v2...)); 

此外,ImmutableMap.Builder是其他的選擇,創建複雜的源地圖:

myMap = Maps.newHashMap(new ImmutableMap.Builder<K, V>() 
        .put(k1, v1) //One k-v pair 
        .putAll(otherMap) //From other Map 
        .put(Maps.immutableEntry(k2, v3)) //From a Map Entry 
        ... 
        .build()); 

加:我的代碼不是ImmutableMap的初衷。如果納瓦堅持使用番石榴圖書館;)

+0

雖然這在垃圾創建方面有點浪費。在第一種情況下,只要你想創建一個'HashMap',你就創建一個臨時的'ImmutableMap';在第二種情況下,你創建一個'ImmutableMap.Builder'(它包含一個可變的'Map'),然後創建一個'ImmutableMap'在最終創建'HashMap'之前... –

+0

@FrankPavageau是的,你是對的。我的代碼不是ImmutableMap的初衷。我的意思是如果納瓦堅持使用番石榴圖書館;) –

3

您實際上並不需要靜態初始化。以下有什麼問題?

Map<K, V> map = Maps.newHashMap(); 
map.put(k1, v1); 
map.put(k2, v2); 
// More put() calls 

// map is now ready to use. 

您可以根據需要圍繞它創建一個輔助方法,但你只能創造這麼多不同的版本(1項,2項,等等)。在某些時候,它不再有幫助。

+0

這是對的,但也許有一些美麗的方式存在? )) – Nawa

+0

那麼,沒有。要麼你爲每個想要初始化'Map'的條目編寫一個靜態方法,要麼你編寫一個以Object []或Object ...爲參數的靜態方法,並確保它的長度爲2的倍數(以獲得整數個條目),但是然後您失去了任何類型檢查。我說堅持put()的順序。 –

3

將這個設置爲可變集合沒有意義。我能想到的唯一原因是你想在創建最初的小可變映射時對此有一個簡寫。因爲你認爲它仍然是可讀

public static <K,V> HashMap<K,V> newHashMap(K k1, V v1) { 
    HashMap<K, V> map = new HashMap<>(); 
    map.put(k1, v1); 
    return map; 
} 

public static <K,V> HashMap<K,V> newHashMap(K k1, V v1, K k2, V v2) { 
    HashMap<K, V> map = new HashMap<>(); 
    map.put(k1, v1); 
    map.put(k2, v2); 
    return map; 
} 

... 

覆蓋它,只要:如果你需要這個安靜經常寫自己的實用方法。由於鍵和值的混合,在我看來,這種方式很難快速讀取 - 即使格式正確。 番石榴傢伙停止了這5個鍵值對太多imho。