私はDagNodeクラスをJavaで記述しようとしています。スマートポインタとJavaでのRef Counting
—(私はC++から来たんだ)—は、スマートポインタと参照カウントを使用することであろうC++でアイデア:ノードが作成されると、その場合、私はいくつかのテーブルで見ていきます
をノードはすでに存在します。もしそうなら、私は古いものへのポインタを返します。それ以外の場合は、新しいノードを作成してください。
コピーコンストラクタやデストラクタなどのオーバーロードされたC++メソッドは、再カウントを行い、ノードの参照カウントが0になると、ノードは上記のテーブルから削除されます。 (C++でもメモリが解放されます)
しかし、Javaではref-countingを自動的に行う方法はないようです。テーブルからノードを削除してガベージコレクションできるようにするにはref-countingを行う必要があります。実際には、それぞれの機能の開始時と終了時にnode->incRef()
とnode->decRef()
と呼ぶことは避けたいと考えています。
JavaでこのC++イディオムをどのように行うのですか?
Javaの参照カウントは自動ではありません。Java GCは参照カウントにまったく依存しません。 –
これを私があなたに理解してもらうために繰り返すことを許可します。基本的に私はWeakReferenceのテーブルを持っており、ReferenceQueueのポイントはテーブルからWeakReferenceを追い出すことです。テーブルにWeakReferenceを付けることはまだGCであることを意味しますが、スタックや他のオブジェクトに定期的な参照がある場合、GC'dできません。そして、ReferenceQueueは、ガベージコレクションの前にテーブルからの退去が発生したことを確認するので、すべてが良好です。 –
それは驚くほどエレガントなソリューションです!私がJavaに感銘を受けたことはそれほど頻繁ではありません。 –