0

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

问题是当缓存为空时,

  • 调用getAll记录集合返回 Map 类型RegularImmutableMap
  • 并且调用单个记录getAll的集合返回 Map 类型。SingletonImmutableBiMap

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

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

4

1 回答 1

1

请注意,这与您在返回收集的结果之前可能使用简单调用Cache的实现无关。LocalCacheImmutableMap.copyOf()

所以你的根本问题是为什么ImmutableMap.of(K, V)返回一个ImmutableBiMap

这是自 2012 年以来的行为,简短的回答是因为ImmutableBiMapextends ImmutableMap,因此不需要同时具有 aSingletonImmutableMapSingletonImmutableBiMapimplementation。

正如 matoni 所说,ImmutableMap.values()返回 an ImmutableCollection,因此您不能依赖特定的实现来返回 anImmutableList或 an ImmutableSet(或其他一些扩展的神秘类型ImmutableCollection)。不仅如此,您不能依靠现有的行为保持这种状态!有一段时间(从2 月6 月ImmutableMap实际上没有使用ImmutableBiMap.

这意味着您不应该期望ImmutableMap.values()返回一个ImmutableList,并且任何这样做的代码都会被破坏。如果您需要ImmutableList使用-ImmutableCollection对于.asList()大多数不可变集合,这可以在 O(1) 时间和空间内返回视图。

于 2017-12-06T09:46:12.910 回答