Java 为什么在Guava 10中不推荐使用软键()?

Java 为什么在Guava 10中不推荐使用软键()?,java,guava,Java,Guava,从Guava 10开始,已弃用,并且中不存在相应的方法 为什么会有这样的变化?我需要对使用它的现有代码做什么?我写这个问题是因为,一开始,我真的很想知道为什么(因为我有使用软键的现有代码)。然而,原因在反思中是显而易见的,我决定将其发布在这里,以防其他人也使用软键,并对同样的事情感到疑惑 简而言之,原因是软键从一开始就没有任何意义。因此,它最初的加入本身就是一个错误,番石榴开发商正在通过反对纠正这个错误 一般来说,如果希望对象在所有强引用消失后保持一段时间,可以使用软引用;相反,对于弱引用,一旦

从Guava 10开始,已弃用,并且中不存在相应的方法

为什么会有这样的变化?我需要对使用它的现有代码做什么?

我写这个问题是因为,一开始,我真的很想知道为什么(因为我有使用
软键的现有代码)。然而,原因在反思中是显而易见的,我决定将其发布在这里,以防其他人也使用
软键
,并对同样的事情感到疑惑

简而言之,原因是
软键
从一开始就没有任何意义。因此,它最初的加入本身就是一个错误,番石榴开发商正在通过反对纠正这个错误

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

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

  • 由于
    软键
    weakKeys
    地图使用基于身份的查找,获取感兴趣的条目的唯一方法是对其键进行强引用。†因此,一旦没有强键引用,条目实际上就死了(没有复活的可能性)
  • 软键
    weakKeys
    之间唯一实际的区别是,在所有对其键的强引用消失后,条目在地图中保留的时间有多长。因为这样的条目无论如何都是死的,所以使用
    软键
    而不是
    weakKeys
    只会延迟条目的退出,这是没有充分理由的
因此,当遇到使用
软键的代码时,最合适的替代方法是
weakKeys


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

以下是我对该问题的解释(对Chris的回答更完整一点)


为什么
软键使用身份匹配?这是WeakHashMap的设计,它不必遵循。而
softValues
对我来说也毫无意义;也许
softEntry
更合适。@不可替换的
softValues
表示“保留对该值的软引用,如果该引用被清除,则删除该项。”拥有
softEntries
是没有意义的,因为您通常不会持有
Map.Entry
对象。这一切都是您自己解决的!?你完全正确。我们花了三年时间才意识到这一点。:-)@实际上,不可替换的WeakHashMap不使用标识。但身份是唯一真正有意义的东西。通过使用弱键或软键(与值相反),您表明该键的GC是一个重要事件——这意味着可以清除条目,因为它不太可能很快再次被查询。对于值对象(使用重写的equals()),这是不合逻辑的。一个引用可能是GC'd,但有任意数量的其他引用浮动。@unreputable(我到达这个线程有点晚)对一个键的软引用是一个值对象(具有重写的equals)似乎是完全有意义的,因为只有当内存不足时,键(及其映射项)才会被丢弃。对值对象的弱引用没有多大意义(可能在时间缓存中除外)。但是,对于软引用对象的基于身份的查找,如在Guava maps中,软引用键没有多大意义,但这是因为坚持基于身份的查找,而不是因为软引用。