2011-08-19 39 views

回答

78

基本上,它可以讓你做到這一點:

callAPIThatTakesAMap(Collections.singletonMap(key, value)); 

,而不是這樣的:

Map<KeyType, ValueType> m = new HashMap<KeyType, ValueType>(); 
m.put(key, value); 
callAPIThatTakesAMap(m); 

這是好得多當你只有一個鍵/值對。這種情況可能不會經常出現,但singleton()singletonList()可能非常有用。

+7

我一直在使用Spring的命名參數JDBC模板的DAO中使用singletonMap。如果你有一個簡單的select語句,比如「select foo from bar where id =:barId」,那麼你將需要一個帶有單個鍵值對barId = 123的參數映射。這是使用singletonMap()的好地方。 – spaaarky21

+1

如果任何API將映射作爲輸入並且我使用Collections.singleton(key,value),那麼我傳遞了不可變映射,這可能對該API不太好,因爲可能是該API向此映射添加更多元素,並且在這種情況下,沒有什麼可以做,因爲它是不可變的。 – AKS

+2

@AKS:理論上是的,但實際上只讀訪問是非常普遍的,並且應該從API文檔中明確是否將條目添加到作爲參數傳遞的映射中。 –

11

如果您需要將映射傳遞給某些通用代碼(作爲參數或作爲方法的結果),並且您知道在這種特殊情況下 - 但可能不會在其他情況下傳遞映射到相同的通用代碼 - 您想要通過的地圖只有一個鍵。在這種情況下,SingletonMap比完整的地圖實現更有效率,對於程序員也更方便,因爲您需要說的所有內容都可以在構造函數中說明。

+0

很好的解釋 –

4

它主要是爲了方便和抽象。有些API以Collection作爲參數,很高興有一個簡單的方法將對象轉換爲SetMap

singletonMap()singletonList()實際上是在Java 1.3中的singletonSet()之後引入的,因爲singletonSet()被證明是有用的。

+2

沒有singletonSet()方法,它只是被稱爲singleton() –

0

這僅僅是另一個例子,但我寫這行代碼:

@Override public Map<Action, Promise<Boolean>> actOnResults() throws Exception { 
    return Collections.singletonMap(Action.UPDATE_DATABASE, saver.save(results)); 
} 

注意@Override。更一般的界面可以採取很多事情的地圖;這個特定的實例總是返回一個包含一件事情的地圖。還要注意地圖的關鍵是Enum。所以地圖不應該很大,它們只是應該包含任何指定動作的結果。在我的實例中,最多有5個動作,而這個實例只使用其中的一個。

要完成,EnumSetEnumMap在這些情況下通常是合適的,但與上面的代碼相比,這些仍然是煩人的冗長。

4

此外,由Collections.singletonMap()返回的SingletonMap實現比常規HashMap具有更小的內存佔用。它只需要包含兩個成員字段:鍵和值,而HashMap維護一個Node對象的內部數組以及其他成員字段。因此,如果您在內存中創建這些映射的批次,那麼使用Collections.singletonMap()將是一個謹慎的選擇。

0

很多答案告訴你的時候,但我想指出何時not use it

如果你想put items later on不使用它

因爲singletonMap看跌實現將拋出UnsupportedOperationException

相關問題