2012-09-14 26 views
7

私はDagNodeクラスをJavaで記述しようとしています。スマートポインタとJavaでのRef Counting

—(私はC++から来たんだ)—は、スマートポインタと参照カウントを使用することであろうC++で

アイデア:ノードが作成されると、その場合、私はいくつかのテーブルで見ていきます

  • をノードはすでに存在します。もしそうなら、私は古いものへのポインタを返します。それ以外の場合は、新しいノードを作成してください。

  • コピーコンストラクタやデストラクタなどのオーバーロードされたC++メソッドは、再カウントを行い、ノードの参照カウントが0になると、ノードは上記のテーブルから削除されます。 (C++でもメモリが解放されます)

しかし、Javaではref-countingを自動的に行う方法はないようです。テーブルからノードを削除してガベージコレクションできるようにするにはref-countingを行う必要があります。実際には、それぞれの機能の開始時と終了時にnode->incRef()node->decRef()と呼ぶことは避けたいと考えています。

JavaでこのC++イディオムをどのように行うのですか?

答えて

6

Javaでは、参考調査とゴミは自動です。

しかし、それは完全に隠されているわけではありません。

オブジェクトがガーベージされることがあることを知りたい場合はReferenceQueue、ごみを防止しないポインタを保持したい場合はWeakReferenceとする必要があります。

私はあなたが必要とする最良のソリューションを見つけるためにjava.lang.ref packageの説明を見ることをお勧めします。

+3

Javaの参照カウントは自動ではありません。Java GCは参照カウントにまったく依存しません。 –

+0

これを私があなたに理解してもらうために繰り返すことを許可します。基本的に私はWeakReferenceのテーブルを持っており、ReferenceQueueのポイントはテーブルからWeakReferenceを追い出すことです。テーブルにWeakReferenceを付けることはまだGCであることを意味しますが、スタックや他のオブジェクトに定期的な参照がある場合、GC'dできません。そして、ReferenceQueueは、ガベージコレクションの前にテーブルからの退去が発生したことを確認するので、すべてが良好です。 –

+0

それは驚くほどエレガントなソリューションです!私がJavaに感銘を受けたことはそれほど頻繁ではありません。 –

2

ノードが作成されると、そのノードがすでに存在するかどうかを調べ、そうであれば古いノードへのポインタを返します。そうでない場合は新しいノードを作成します。

Javaでこのルックアップメカニズムを作成することはそれほど難しくありません。ファクトリメソッドを使用するだけで、 'テーブル'をチェックし、同じインスタンスが既に存在する場合はそれを返します。私はJavaの場合

(それは、ガベージコレクトすることができる)ので、私はテーブルからノードを削除するときに知っている基準カウント必要

WeakReferenceクラスを有しています。これは参照カウントを許可しませんが、誰もそれを参照しなくなったときにオブジェクトをGCで編集できるようにします。

これら2、あなたができ

  • WeakReference S
  • 使用(例えばWeakHashmapWeakReference Sを使用して利用可能なJavaのCollection実装の1つでポピュレート 'テーブル' を構築結合
関連する問題