the source codeによれば、PhantomReferenceクラスを使用します。ドキュメントによれば、コレクタの後にエンキューさ
ファントム参照オブジェクトは、それらの言及は、そうでなければ再生することができると判断します。 ファントム参照は、Java終了化メカニズムで可能なよりも柔軟性の高い方法で、死亡前のクリーンアップアクションのスケジューリングに最もよく使用されます。
ある時点でファントム参照の対象がファントム到達可能であると判断した場合、その時点または後で参照をエンキューします。
再生可能オブジェクトが確実に残るように、ファントム参照の参照先は取得できません。ファントム参照のgetメソッドは常にnullを返します。
ファインリファレンスは、ファインリファレンスとは異なり、ガベージコレクタによってキューに登録されると自動的にクリアされません。ファントム参照を介して到達可能なオブジェクトは、そのような参照がすべてクリアされるか、それ自体が到達不能になるまでそのままになります。 - 新しいファントム参照が
q
を参照するオブジェクト - 参照が登録され、または場合はnullされるべきでキュー
referent
:
PhantomReference
コンストラクタは2つの引数を受け付け登録は不要です
q
引数はinst ReferenceQueue
クラスのance。 referent
がファントム到達可能になるとPhantomReference
がこのReferenceQueue
に追加されます。この場合、ReferenceQueue
クラスのpoll()
またはremove()
メソッドを使用してPhantomReference
を取得できます。例えば
:
T objectToWatch = ...;
ReferenceQueue<T> referenceQueue = new ReferenceQueue<T>();
new PhantomReference<T>(objectToWatch, referenceQueue);
// Later on, probably in another thread...
Reference<? extends T> nextReference = referenceQueue.remove();
// Tidy up!
注:PhantomReference
も使用であってもよいSoftReference
とWeakReference
という名前の兄弟クラスがあります。これらの関係はjava.lang.ref package documentationに記載されています。
この目的でファイナライザを使用しないでください。回避できない場合は、ファイナライザを使用しないでください。 finalize()メソッドがガベージコレクションの後すぐに呼び出されるか、まったく呼び出されないという保証はありません(Effective Java 2nd Ed、Item 7を参照)。 java.lang.refパッケージを使用してください。 – Leigh
助けることができれば、ファイナライザを使用しないでください! http://stackoverflow.com/a/158791/74694 –