Skip to main content
 首页 » 编程设计

java之在一个集合中混合不同的引用类型

2024年02月27日42itcoder

SoftReference , WeakReference , PhantomReference可用于自定义垃圾收集过程。所有这些都扩展了 Reference<T>因此可以将它们混合在一个集合中。硬引用(最常见的)不扩展 Reference<T>因此不可能在一个集合中混合硬引用和其他类型的引用。我说得对吗,我们应该放CustomReference<T> extends Reference<T>到集合以实现在单个集合中混合所有类型的对象链接的预期结果 (Collection<Reference<T>>)?

更新:所以在写 SSCCE 时我发现无法扩展 Reference<T>以通常的方式(构造函数是包本地的)。

所以问题现在更新为:我可以使用 单个 集合类创建缓存,它总是保存一些对象(比如 10 个),而其他对象在内存不允许时由 GC 回收吗?除了为硬引用和软引用提供自定义包装并将它们存储在集合中之外,还有其他方法可以做到这一点吗?

请您参考如下方法:

不幸的是Reference<T>根据its JavaDoc,大多数不能(也不能)直接被子类化。 :

Because reference objects are implemented in close cooperation with the garbage collector, this class may not be subclassed directly.

因此,您将无法轻松地(即没有丑陋的 instanceof + 强制转换)在同一个 Collection 中处理软/弱/虚引用普通引用。 .

您可以编写一个包装器,要么使用两个单独的 Collection处理正常和软/弱/幻象引用的对象将它们全部放入相同的Collection<Object>并使用适当的 instanceof检查强制转换以区分对象。