簡體   English   中英

為什么Guava LoadingCache的getAll方法返回不同類型的ImmutableMap?

[英]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 ,因此不需要同時具有SingletonImmutableMapSingletonImmutableBiMap實現。

正如matoni所說, ImmutableMap.values()返回一個ImmutableCollection ,因此您不能依賴於特定的實現來返回ImmutableListImmutableSet (或擴展了ImmutableCollection其他某種神秘類型)。 不僅如此,您不能依賴保持這種狀態的現有行為! 短暫的一段時間(從2月6月 ), ImmutableMap實際上沒有使用ImmutableBiMap

這意味着您不應期望ImmutableMap.values()返回ImmutableList ,並且這樣做的任何代碼都將被破壞。 如果需要ImmutableList中的ImmutableCollection使用.asList() -對於大多數不可變集合,這可以返回O(1)時空視圖。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM