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?
Referenzzählung in Java ist nicht automatisch - Java GC verlässt sich überhaupt nicht auf Referenzzählung. –
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. –
Das ist eine überraschend elegante Lösung! Es ist nicht so oft, dass ich von Java beeindruckt bin. –