为什么getAll方法的Guava LoadingCache返回不同​​类型的ImmutableMap?

时间:2017-08-04 19:52:06

标签: java google-guava-cache

我有简单的Guava LoadingCache用例,我将关键对象列表传递给getAll并实现loadAll以获得缓存中不可用的结果。

问题是当缓存为空时,

  • 调用getAll收集记录会返回RegularImmutableMap类型的地图。
  • 调用getAll收集单条记录会返回SingletonImmutableBiMap类型的地图。

这最终会导致另一个问题。当我尝试收集map.values()时,RegularImmutableMap会返回ImmutableList类型,而SingletonImmutableBiMap会返回ImmutableSet类型。

从用户的角度来看,为什么getAll方法返回不同类型的ImmutableMap有任何具体原因/优势?

1 个答案:

答案 0 :(得分:1)

请注意,这与Cache无关 - LocalCache实施,您可能只是在返回收集的结果之前使用calls ImmutableMap.copyOf()

所以你的基本问题实际上是为什么ImmutableMap.of(K, V) return an ImmutableBiMap

这是行为since 2012而简短的回答是因为ImmutableBiMap扩展了ImmutableMap,因此无需同时拥有SingletonImmutableMapSingletonImmutableBiMap {1}}实施。

正如matoni所说,ImmutableMap.values()会返回ImmutableCollection,因此您无法依赖特定的实现来返回ImmutableListImmutableSet(或其他一些神秘类型)扩展ImmutableCollection)。不仅如此,你不能依靠这种方式保持现有的行为!暂时(从FebruaryJuneImmutableMap实际上并没有使用ImmutableBiMap

这意味着您不应期望ImmutableMap.values()返回ImmutableList,并且执行此操作的任何代码都会被破坏。如果您需要来自ImmutableList .asList()ImmutableCollection - 对于大多数不可变集合,这可以在O(1)时间和空间中返回视图。