Frage

Gibt es eine Möglichkeit, einen Handler registrieren zu erstellen, die genau zu dem Zeitpunkt aufgerufen werden, wenn der letzte Verweis auf ein bestimmtes Objekt freigegeben wird?

Ein Beispiel sei ein Objekt, das von einer physischen Datendatei und sobald das Objekt wird nicht referenzierte, die Datei geschlossen werden soll, gesichert wird und als umbenannt. Es wäre schön, wenn dies möglich ist, ohne explizit zu müssen auf diesem Objekt eine „close“ Methode aufrufe.

Alle Benachrichtigungsmechanismen Ich bin mir bewusst, von dem schwachen / Phantom Referenzbereich nur, dass eine Meldung angeben, zu einem bestimmten Zeitpunkt in der Zeit auftreten, aber es gibt keine gurantee, wann dies geschehen wird ...

War es hilfreich?

Lösung

Kurz gesagt, nicht.

Die Java-Spezifikation verweigert explizit die Möglichkeit, zu wissen, wann der letzte Verweis freigegeben wird. JVM-Implementierungen (und Optimierungen) hängen davon ab. Es gibt keinen Haken.

Andere Tipps

Von meinem Verständnis, und ich habe seit einiger Zeit sieht einen „destructor“ für Java-Objekte zu finden, gibt es keine Möglichkeit zu wissen, wann Sie die letzte Referenz verlieren. Java-Spuren Verweise auf Objekte, aber aus Leistungsgründen aktualisiert diese Informationen nur während der Garbage Collection.

Die nächste Sache ist die Finalisierung Methode, die während der Garbage Collection genannt werden sollen, aber es gibt keine Garantie, dass es auch dann aufgerufen wird.

Ich denke, WeakReference tut, was Sie wollen. Ein WeakReference wird in die Reference setzen, sobald seine schwach erreichbar (das heißt alle starken Referenzen sind verschwunden).

In diesem Artikel von Ethan Nicholas .

Wenn Sie sich Sorgen über einige Referenzen sind nicht die Reference beim Herunterfahren zu erreichen, halten Sie dann eine Liste aller erstellten Objekte (mit WeakReferences oder PhantomReferences). Fügen Sie einen Shutdown-Hook, der die Liste für alle ausstehenden Referenzen überprüft und durchzuführen, was Aktion, die Sie benötigen.

Das Problem ist, „Wie Sie dies tun implementieren, ohne etwas eine Referenz auf das Objekt halten?“

Auch wenn Sie dieses Problem übergeben bekommen könnte, sagen mit einem Service werden wir die HandleManager nennen, würde die HandleManager dann eine neue Referenz auf das Objekt erstellen müssen, um Handler zu übergeben. Dann könnte Ihr Handler entweder (a) speichert einen Verweis darauf, was die HandleManager verwirren würde, die das nicht referenzierte Objekt zu zerstören erwartet; oder (b) lassen Sie die Referenz, was bedeutet, dass die letzte Referenz wieder freigegeben wurde, was bedeutet, dass der Handler wieder genannt werden hat ....

Wenn Sie externe Ressourcen wie Dateien verwalten müssen, das Beste, was Sie in Java tun können, ist ein close () Funktion (einen beliebigen Namen wählen). Sie können finalize () als „Gürtel und Hosenträger“ Versicherung verwenden, aber das hat nicht vorhersehbar Timing. So Ihre Hauptverteidigungslinie muss die close () Funktion.

meine Antwort Siehe Warum würden Sie jemals finalize () implementieren?

Das kann nicht mit Java getan werden - es braucht eine Garbage Collector Referenzzählung, soweit ich das beurteilen kann. Haben Sie darüber nachgedacht Öffnen und physische Datendatei Ihres Objekts schließt je nach Bedarf, anstatt sie offen für die gesamte Lebensdauer des Objekts zu halten?

Sie könnte Überschreibung finalize() in Ihrem Objekt, aber das ist problematisch, aus Gründen, andere schon erwähnt haben.

Für Ihr spezifisches Beispiel könnten Sie einen Blick etwas wie File.deleteOnExit() , die die Datei, sobald die VM-Exits entfernen würde.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top