gpt4 book ai didi

scala - 弱引用相等

转载 作者:行者123 更新时间:2023-12-02 00:20:29 25 4
gpt4 key购买 nike

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

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

最佳答案

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

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

编辑(回应评论):
您正在构建身份服务。这维护了实体<->标识符的映射,该映射必须在对实体的所有引用的生命周期内保持不变。大多数时候实体和代表实体的对象是同一个东西,对于这些场合使用 WeakHashMap[Entity,Identifier]对于实体->标识符映射和 WeakHashMap[Identifier,WeakReference[Entity]]用于标识符-> 实体映射(当且仅当需要时)。

如果你真的需要实体只要引用它的标识符就可以存活,你可以通过维护一个影子标识符来做到这一点,该标识符可以在需要时重新生成标识符,因此使用:WeakHashMap[Entity,Shadow[Identifier]WeakHashMap[Identifier, Tuple2[Shadow[Identifier],Entity]]用适当的轮回逻辑包裹在 Shadow 中,观察 ReferenceQueues。

然而,在大多数情况下,如果简单的方法不够用,您就需要跟踪外部标识符,此时事情对于您要解决的确切问题来说既非常棘手又非常敏感。

关于scala - 弱引用相等,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11182009/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com