[英]Why getAll method of Guava LoadingCache returns different types of ImmutableMap?
我有簡單的Guava LoadingCache用例,其中將關鍵對象列表傳遞給getAll
並實現了loadAll
以在緩存中不可用時獲取結果。
問題是當緩存為空時,
getAll
以收集記錄將返回RegularImmutableMap
類型的Map。 getAll
以收集單個記錄將返回類型為SingletonImmutableBiMap
Map。 最終導致另一個問題。 當我嘗試在其上收集map.values()
時, RegularImmutableMap
返回一個ImmutableList
類型,而SingletonImmutableBiMap
返回一個ImmutableSet
類型。
從用戶角度來看,為什么getAll
方法返回不同類型的ImmutableMap
有任何特定的原因/優勢?
請注意,這與Cache
無關-您大概在返回收集的結果之前只是調用ImmutableMap.copyOf()
來使用LocalCache
實現。
因此,您的基本問題實際上是為什么ImmutableMap.of(K, V)
返回ImmutableBiMap
嗎?
自2012年以來就是這種情況,簡單的答案是因為ImmutableBiMap
擴展了ImmutableMap
,因此不需要同時具有SingletonImmutableMap
和SingletonImmutableBiMap
實現。
正如matoni所說, ImmutableMap.values()
返回一個ImmutableCollection
,因此您不能依賴於特定的實現來返回ImmutableList
或ImmutableSet
(或擴展了ImmutableCollection
其他某種神秘類型)。 不僅如此,您不能依賴保持這種狀態的現有行為! 短暫的一段時間(從2月到6月 ), ImmutableMap
實際上沒有使用ImmutableBiMap
。
這意味着您不應期望ImmutableMap.values()
返回ImmutableList
,並且這樣做的任何代碼都將被破壞。 如果需要ImmutableList
中的ImmutableCollection
使用.asList()
-對於大多數不可變集合,這可以返回O(1)時空視圖。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.