在.NET中,有一个名为ConditionalWeakTable
的类。这是一个映射/字典,它保证了对象的生存期和垃圾收集的资格。
它保留对键的弱引用,如果无法从表外的任何位置访问键,则会自动删除键(因此,键不会通过成为表的成员而持久化,如果可以从表中任何其他类似的不可访问的键或值访问键,即使存在循环引用等,也不会持久化)。
值仍然由表保持活动状态,但如果键由于不可访问而被删除,则这些值将被删除。
此类用于在运行时将属性附加到对象,而不会导致内存泄漏或干扰垃圾收集。
有没有办法在Java或Scala中复制这种功能?
您可以使用Java的WeakHashMap<K,V>
:
基于哈希表的Map接口实现,带有弱键。WeakHashMap中的条目在其关键字为已不再正常使用。更准确地说给定密钥的映射不会阻止该密钥被丢弃通过垃圾收集器,也就是说,使其可终结、最终化,以及然后回收。当密钥被丢弃时,它的条目有效从映射中删除,因此该类的行为与其他Map实现。
或者,如果您使用Scala,请使用scala.collection.mutable.WeakHashMap[A,B]
提供的包装器