我没有使用PhantomReferences。似乎很少有真实世界使用的好例子。
当你的队列中出现一个幻像时,你怎么知道它是哪个对象? get()方法似乎没用。根据{{3}},
因为幻象参照的指示对象总是无法访问, 此方法始终返回null。
我认为除非您的对象是单身,否则您总是希望使用PhantomReference的子类,在其中放置您需要的任何纪念品以了解死亡的内容。
这是正确的,还是我错过了什么?
SoftReferences也是如此吗? For WeakReferences?
相关使用示例的链接会很棒。
答案 0 :(得分:1)
你的问题让我对它进行了一些调查,我发现了这个非常好的书面解释和所有参考类型的例子。他甚至谈到幻像参考的一些(微弱)用法。
http://weblogs.java.net/blog/2006/05/04/understanding-weak-references
答案 1 :(得分:1)
我认为除非您的对象是单身,否则您总是希望使用PhantomReference的子类,在其中放置您需要的任何纪念品以了解死亡的内容。
您还可以使用Map<Reference<?>, SomeMetadataClassOrInterface>
来恢复所需的元数据。由于ReferenceQueue<T>
会返回Reference<T>
,您必须将其强制转换为您期望的PhantomReference
的任何子类,或让Map<>
为您执行此操作。
对于它的价值,看起来使用PhantomReferences会给你带来一些负担:
与软引用和弱引用不同,垃圾收集器在排队时不会自动清除幻像引用。通过幻像引用可访问的对象将保持不变,直到所有此类引用都被清除或自身无法访问。
因此您必须自己clear()
引用,以便回收内存。 (为什么必须这样做才有用,而让JVM为你做这件事超出我的意义)