WeakReference相等

时间:2012-06-24 23:34:01

标签: scala

如何将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

是否可以实际比较弱引用?

1 个答案:

答案 0 :(得分:3)

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

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

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

如果您确实需要实体生存,只要引用其标识符,您可以通过维护可在需要时重新生成标识符的影子标识符来实现,因此使用:WeakHashMap[Entity,Shadow[Identifier]WeakHashMap[Identifier, Tuple2[Shadow[Identifier],Entity]]在Shadow中使用适当的轮回逻辑包裹着ReferenceQueues。

然而,大多数情况下,如果简单方法不充分,则需要跟踪外部标识符,此时事情既棘手又极其敏感,而且对您要解决的确切问题非常敏感。