为什么在Guava 10中不推荐使用softKeys()?

时间:2011-10-01 04:22:51

标签: java guava

自Guava 10起,MapMaker.softKeys已弃用,CacheBuilder中不存在相应的方法。

为什么要做出这种改变?使用它的现有代码需要做什么?

2 个答案:

答案 0 :(得分:15)

我写了这个问题,因为最初,我确实想知道为什么(因为我现有的代码使用了softKeys)。然而,原因在反思上是显而易见的,我决定在这里发布,以防其他人也使用softKeys并且想知道同样的事情。

简而言之,原因是softKeys从一开始就没有任何意义。因此,它最初的包含本身就是一个错误,Guava开发人员正在通过弃用来纠正错误。

一般情况下,如果你希望在所有强引用消失之后对象保持一点,你可以使用软引用;相反,对于弱引用,一旦没有强引用或软引用,对象通常很快就会被收集。这对于您希望暂时保留的缓存非常有用,因此使用相应键的查找将“恢复”该值的强引用。

但是,这种行为对键没有任何意义:

  • 由于softKeysweakKeys地图使用基于身份的查找,因此获得感兴趣的条目的唯一方法是拥有对其密钥的强引用。因此,一旦没有强大的密钥引用,该条目实际上已经死亡(没有复兴的可能性)。
  • softKeysweakKeys之间唯一的实际区别是,在对其键的所有强引用都消失后,条目在地图中保留多长时间。由于此类条目已无效,因此使用softKeys代替weakKeys只会延迟条目的驱逐,这是没有充分理由的。

因此,大多数情况下,当遇到使用softKeys的代码时,更合适的替代品是weakKeys

†我没有考虑通过迭代获取条目的情况,或基于密钥查找的其他任何内容,因为地图主要是基于密钥的操作。

答案 1 :(得分:7)

这是我尝试解释这个问题(对克里斯的回应稍微完整一点)

http://groups.google.com/group/guava-discuss/browse_thread/thread/764af1e627d6fa0e?pli=1