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
检查强制转换以区分对象。