7

Java で DagNode クラスを作成しようとしています。これにより、2 つのノードが参照として等しい場合に論理的に等しくなります。

C++ のアイデア (私は C++ 出身です) は、スマート ポインターと参照カウントを使用することです。

  • ノードが作成されると、そのノードが既に存在する場合はテーブルを検索します。もしそうなら、私は古いものへのポインタを返します。それ以外の場合は、新しいノードを作成します。

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

ただし、Java で参照カウントを自動的に行う方法はないようです。(ガベージ コレクションを実行できるように) テーブルからノードを削除するタイミングを知るために、ref-counting を実行する必要があります。また、各関数の開始時と終了時に and を node->incRef()呼び出すことは避けたいと考えています。node->decRef()

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

4

3 に答える 3

6

Javaでは、リファレンス調査とガベージは自動です。

しかし、それは完全に隠されているという意味ではありません。

オブジェクトがガベージされるタイミングを知りたい場合はReferenceQueueが必要なようです。ガベージを防止しないポインターを保持したい場合は、おそらくWeakReferenceが必要です。

java.lang.ref パッケージの説明を参照して、ニーズに最適なソリューションを見つけることをお勧めします。

于 2012-09-14T17:15:52.770 に答える
2

ノードが作成されると、そのノードがすでに存在する場合はテーブルを検索し、存在する場合は古いノードへのポインターを返し、そうでない場合は新しいノードを作成します。

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

参照カウントが必要なので、テーブルからノードをいつ削除するかがわかります (したがって、ガベージ コレクションを実行できます)。

そのため、JavaにはWeakReferenceクラスがあります。参照カウントを行うことはできませんが、誰もオブジェクトを参照しなくなったときにオブジェクトを GC することができます。

これら2つを組み合わせると、次のことができます

  • WeakReferencesが入力された「テーブル」を作成する
  • s を使用する利用可能な JavaCollection実装の 1 つを使用しますWeakReference(たとえば、 a WeakHashmap)
于 2012-09-14T18:14:51.250 に答える