4

如何将 ref.WeakReference 实例与另一个 ref.WeakReference 实例进行比较?

内置的 equals 方法没有通过简单的检查:

import ref.WeakReference
val st : String = "qwerty"
val r1 : WeakReference[String] = new WeakReference(st)
val r2 : WeakReference[String] = new WeakReference(st)
r1 == r2
res1: Boolean = false

可以使用r1.get == r2.get,但此方法无法用于比较对已处置对象的引用:在这两种情况下,我都会得到 None 和 None 等于 None

是否可以实际比较弱参考?

4

1 回答 1

3

问题是当对象被取消引用时没有安全的默认行为;因此,WeakReference 不会假装提供一个。将它包装在一个确实实现了适当行为的对象中是微不足道的。如果您愿意,您甚至可以提供一个隐式并让类型系统确保您的引用被正确的 equals 行为所要求。

所以简短的回答是:这不是为了保护你不去想它。

编辑(回应评论):您正在构建身份服务。这维护了实体<->标识符的映射,该映射必须在对实体的所有引用的生命周期内持续存在。大多数情况下,实体和表示实体的对象是同一事物,对于这些情况,使用 aWeakHashMap[Entity,Identifier]用于实体->标识符映射和 aWeakHashMap[Identifier,WeakReference[Entity]]用于标识符->实体映射(如果且仅当需要时)。

如果您确实需要实体与对其标识符的引用一样长,您可以通过维护一个影子标识符来做到这一点,该标识符可以在需要时重生标识符,因此使用:WeakHashMap[Entity,Shadow[Identifier]WeakHashMap[Identifier, Tuple2[Shadow[Identifier],Entity]]在 Shadow 中使用适当的重生逻辑包装来观察 ReferenceQueues。

但是,大多数情况下,如果简单的方法不合适,您就需要跟踪外部标识符,此时事情既非常棘手,又对您要解决的确切问题非常敏感。

于 2012-06-25T00:18:20.537 回答