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

Chr*_*ung 11 java guava

从Guava 10开始,MapMaker.softKeys不推荐使用,并且不存在相应的方法CacheBuilder.

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

Chr*_*ung 15

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

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

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

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

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

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

†我没有考虑通过迭代或基于键的查找以外的任何方式获取条目的情况,因为映射主要是基于键的操作.

  • 你自己想出了这一切!?你是完全正确的.我们花了三年时间才意识到这一点.:-) (8认同)
  • @irreputable(我到达这个线程有点晚了)对一个值对象(带有重写的等号)的键的软引用似乎很有意义,因为键(及其映射条目)只会被丢弃记忆变得稀缺.对值对象的弱引用没有多大意义(除了可能在临时缓存中).但是,对于软引用对象的基于身份的查找,如在Guava映射中,软引用键没有多大意义,但这是因为坚持基于身份的查找,而不是因为软引用. (3认同)
  • @irreputable WeakHashMap实际上不使用身份.但身份是唯一真正有意义的事情.通过使用弱键或软键(而不是值),您指示该键的GC是一个重要事件 - 意味着可以清除该条目,因为它不太可能很快再次查询.对于一个不合逻辑的值对象(重写的equals()).一个参考可能是GC'd,但有许多其他的浮动. (2认同)

Dim*_*eou 7

这是我尝试解释这个问题(克里斯的回应更完整)

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