2012-09-14 13 views
7

Ich versuche, DagNode-Klasse in Java zu schreiben, wobei zwei Knoten logisch gleich sind, wenn sie als Referenzen gleich sind.Smart Pointer und Ref Counting in Java

Die Idee in C++ — (Ich bin von C++) — wäre intelligente Zeiger und Referenzzählung zu verwenden:

  • Wenn ein Knoten erstellt wird, ich, wenn die in irgendeiner Tabelle nachschlagen werden Knoten existiert bereits. Wenn ja, gebe ich einen Zeiger auf den alten zurück. Sonst einen neuen Knoten erstellen.

  • Überladene C++ - Methoden wie Kopierkonstruktoren und Destruktoren zählen ref-counting, und wenn der ref-count eines Knotens auf 0 fällt, wird der Knoten aus der oben genannten Tabelle entfernt. (C++ wird kostenlos auch die Erinnerung.)

Allerdings scheint es keine Möglichkeit, automatisch ref Zählung in Java zu tun. Ich muss Ref-Counting tun, um zu wissen, wann ein Knoten aus der Tabelle geräumt werden muss (so dass es Müll gesammelt werden kann), und ich möchte vermeiden, am Anfang und Ende jeder Funktion node->incRef() und node->decRef() aufzurufen.

Wie machen wir dieses C++ - Idiom in Java?

Antwort

6

In Java sind die Referenzübersicht und der Müll automatisch.

Aber das bedeutet nicht, dass es völlig verborgen ist.

Sie scheinen ReferenceQueue zu benötigen, wenn Sie wissen möchten, wann ein Objekt gewoben werden kann, und vielleicht WeakReference, wenn Sie Zeiger behalten möchten, die den Abfall nicht verhindern.

Ich schlage vor, Sie werfen einen Blick auf die Beschreibung der java.lang.ref package, um die beste Lösung für Ihre Bedürfnisse zu finden.

+3

Referenzzählung in Java ist nicht automatisch - Java GC verlässt sich überhaupt nicht auf Referenzzählung. –

+0

Erlauben Sie mir, dies zu wiederholen, um sicherzustellen, dass ich verstehe. Grundsätzlich habe ich eine Tabelle der WeakReference und der Point der ReferenceQueue soll die WeakReference aus der Tabelle entfernen, wenn sie sowieso GC'd wird. Eine WeakReference in der Tabelle bedeutet, dass es immer noch GC'd sein kann, aber wenn es eine regelmäßige Referenz auf dem Stack oder in einem anderen Objekt gibt, dann kann es nicht GC'd sein. Und die ReferenceQueue stellt sicher, dass die Räumung aus der Tabelle VOR der Garbage-Collection erfolgt, also ist alles gut. –

+0

Das ist eine überraschend elegante Lösung! Es ist nicht so oft, dass ich von Java beeindruckt bin. –

2

Wenn ein Knoten erstellt wird, suchen Sie in einer Tabelle nach, ob dieser Knoten bereits existiert, und wenn das der Fall ist, geben Sie einfach einen Zeiger auf den alten Knoten zurück, andernfalls den neuen Knoten.

Diese Nachschlagefunktion in Java ist nicht so schwierig. Verwenden Sie einfach eine Factory-Methode, die eine 'Tabelle' überprüft und die gleiche Instanz zurückgibt, wenn sie bereits existiert.

Ich brauche die Referenzzählung, damit ich weiß, wenn ein Knoten aus der Tabelle zu vertreiben (so kann es sein, Müll gesammelt)

Aus diesem Java hat die WeakReference Klasse. Es erlaubt Ihnen nicht, Referenzzählungen durchzuführen, sondern erlaubt dem Objekt, GC-ediert zu werden, wenn niemand mehr darauf verweist.

diese 2 Kombinieren Sie und Sie können

  • einen 'Tisch' mit WeakReference s
  • eine der verfügbaren Java Collection Implementierungen Verwendung bevölkerten konstruieren, die WeakReference s verwendet (zum Beispiel ein WeakHashmap)
Verwandte Themen