我正在使用Guava的Cache<Key, Value>
。每当Key
不再强烈可达时,缓存条目应该被垃圾收集(某天......)。如果CacheBuilder.weakKeys()
没有引用返回Value
,则使用Key
就可以完成此操作。
我可以使这个引用变弱,但这可能随时使Value
无效。我可以处理它,但我不愿意。
我可以使用weakValues()
,但这可能导致非常早期的驱逐,因为我的价值仅在短时间内被引用。
也许我可以使用softValues()
,但SoftReference
是quite broken。
可能我得错了......什么是正确的解决方案?
只需将Value
引用到每个Key
中,我就可以实现所需,但这是不可能的,因为Key
不在我的控制之下。如果是,那么我不需要缓存,没有弱引用,什么都不需要。
这样,每个Key
都会保持相应的Value
可达,这很好 1 。此外,每个Value
都会保持其Key
可访问,但这没有问题,因为对Value
没有长时间的引用。
1 有些过期会更好,但没有必要。
答案 0 :(得分:2)
不幸的是,如果没有ephemerons,这是无法解决的。
答案 1 :(得分:1)
来自Value的指针 - &gt;只要没有别的东西坚持价值,关键就无所谓了。
当Cache转储密钥时,它将被收集。
如果你有System-&gt; Cache-&gt; Key&lt; -Value,当Cache drop key时,你得到System-&gt; Cache Key&lt; -Value。
答案 2 :(得分:1)
如果你真的想要弱键,那么从值到键的弱引用是正确的。
如果您感觉不合适,请提供有关您要完成的更多信息。
答案 3 :(得分:0)
您是否认为可以创建密钥副本,并将其用作地图中的密钥?我想你可能会有像
这样的东西Value v = SomeLibrary.giveMeSomething();
String k = v.getName();
String k1 = new String(k);
cache.put(k1,v);
这将工作b / c k.equals(k1)和k!= k1。希望您可以创建用于Key的类型的副本或克隆(在您的情况下可能不是String)。
然而,这会更改密钥的生命周期 - 因为它不再是Value中的密钥。如果您可以控制放在地图中的特定对象的生命周期,那么您就可以了。
你认为这可行吗?