In Java, wie können wir eine Instanz einer Klasse von einer Methode innerhalb der Klasse zerstören

8

Ich habe es ähnlich wie beim Löschen eines gewöhnlichen Objekts angegangen, dh ich habe die Referenz einfach auf Null gesetzt und den Garbage Collector damit arbeiten lassen.

Um jedoch null innerhalb einer Klasse gleichzusetzen, ist der einzige Verweis auf das Objekt "this". So ist der Code für die folgende Klasse gültig:

%Vor%     
Saurabh Agarwal 11.06.2012, 12:43
quelle

14 Antworten

11
%Vor%

Es ist kein gültiges Java, weil this kein lvalue ist; d. h. nicht etwas, das Sie zuweisen können. Dies ist ein Kompilierungsfehler, genau wie 42 = i; ein Kompilierungsfehler ist.

(Die JLS sagt Folgendes über Zuweisungen: "Das Ergebnis des ersten Operanden eines Zuweisungsoperators muss eine Variable sein, oder es tritt ein Fehler bei der Kompilierung auf." - JLS 15.26.1 Der JLS-Text wird dann fortgesetzt, um die Liste aufzulisten verschiedene Dinge, die als Variablen gelten, und this gehört nicht dazu.)

Außerdem ist es, wie Duffymo sagt, in Java völlig falsch. Lass den GC einfach seine Arbeit machen.

    
Stephen C 11.06.2012, 12:50
quelle
18

Sie "zerstören" keine Objekte in Java. Das ist falsch. Tu es nicht.

Objekte werden auf dem Heap in Java erstellt. Sie leben so lange, wie es eine Referenz gibt, die auf sie zeigt. Der Müllsammler räumt das Durcheinander auf.

Sie sollten auf jeden Fall tun, was Sie können, um sicherzustellen, dass Sie keine unnötigen Referenzen akkumulieren (z. B. Listener in Swing).

Aber Ihr Vorschlag ist überhaupt nicht richtig. Unterbrich und unterlasse es.

    
duffymo 11.06.2012 12:46
quelle
3

HINWEIS: Was Sie vorschlagen, ist höchst unwahrscheinlich nützlich.

Was Sie tun können, ist Delegation.

%Vor%

Da alle Referenzen indirekt sind, können Sie sicherstellen, dass es nur einen Verweis auf das reale Objekt gibt, und löschen Sie es.

Proxys in einigen OSGi-Containern tun dies, wenn eine Komponente entladen wird. Da der Container wenig Kontrolle über den Lebenszyklus der Referenzen hat, würde es schwierig sein, eine Bibliothek (die Implementierung) jemals zu entladen.

    
Peter Lawrey 11.06.2012 12:48
quelle
1

Ihr Ziel ist zutiefst fehlgeleitet.

Entweder hat jemand außerhalb der Instanz einen nicht-schwachen Verweis darauf. Dann wird es nicht gesammelt, egal was du innen machst. Oder niemand tut es, dann wird es schließlich gesammelt werden, egal was du innen tust. In jedem Fall würde this=null keinen Unterschied machen, selbst wenn es sich um legalen Java-Code handelte. Tu es nicht. Wenn Sie sich Sorgen über die Lebensdauer von Objekten und die Erschöpfung des Speichers machen, schauen Sie auf das Objekt, das Sie loswerden möchten.

    
Kilian Foth 11.06.2012 12:48
quelle
1

Das Festlegen von this = null ist wie der Versuch zu sagen, dass sich ein Objekt nicht selbst referenziert. Es bezieht sich immer implizit auf sich selbst. Sie müssen herausfinden, welche anderen Objekte auf dieses verweisen und stattdessen ihre Referenzen löschen. In der Regel geschieht dies automatisch, da die meisten Objekte durch lokale Variablen auf dem Stapel beibehalten werden. Wenn ich "beibehalten" sage, meine ich, dass sie durch eine Kette von Referenzen referenziert werden, die letztendlich zu einer Variablen auf dem Stapel führt. Wenn Sie die Methode verlassen, wird die Referenz gelöscht. Aber wenn Sie eine statische Variable haben, die auf dieses Objekt verweist, könnte dies ein Fall sein, in dem Sie es explizit auf Null setzen müssen.

    
John Watts 11.06.2012 12:48
quelle
0

Damit der Java-Garbage Collector Ihre Klasse aufnehmen kann, sollte er nicht auf andere Klassen verweisen.

Die Anweisung this=null; ist ungültig, weil die linke Seite einer Zuweisung eine Variable sein muss.

    
tom 11.06.2012 12:48
quelle
0

Es gibt keine Möglichkeit, delete explizit in Java anzugeben. Java tut dies, um hängende Referenzen zu vermeiden. Wenn Sie mit delete auf ein Objekt verweisen, auf das andere Objekte verweisen, kann möglicherweise versucht werden, auf die Daten zuzugreifen und einen Verweis auf ungültige Daten zu erhalten.

Sie sollten nicht versuchen, delete -Objekte trotzdem zu verwenden, sondern verschieben Sie einfach alle Referenzen auf das Objekt auf null.

    
Hans Z 11.06.2012 12:48
quelle
0

Nein. Ein Instanzobjekt kann vom GC gelöscht werden, wenn keine Referenz darauf zeigt, dass es von allen laufenden Threads nicht bis zum Objekt navigieren kann. Wenn Sie in dem Objekt sind, das eine Methode ausführt, wird diese Methode von außen aufgerufen, so dass ein Verweis auf das Objekt vorhanden ist. Das Objekt selbst kann nicht zerstört werden, da ein Verweis darauf immer noch draußen bleibt.

Betrachten Sie einen anderen Ansatz für die Speicherverwaltung.

    
David Oliván Ubieto 11.06.2012 12:48
quelle
0

In den Methoden this ist der Verweis auf das Objekt, auf dem die aktuelle Methode aufgerufen wird, so dass es nicht möglich sein sollte, sie zu ändern. Betrachten Sie dies als letzte Referenz.

    
Pshemo 11.06.2012 12:49
quelle
0

Der Lebenszyklus von Objekten wird von der JVM beherrscht. Aus diesem Grund kann ein Objekt nicht entscheiden, wann es nicht mehr benötigt wird. Was Sie tun könnten, ist einige Mühe auf die Verweise auf dieses Objekt. Art der Referenzen könnte verwendet werden, um auf die "Wichtigkeit" des Objekts hinzuweisen.

Die grundlegenden Arten von Referenzen in Java finden Sie hier:

Mehr hier: Ссылка

Diskussion über die Referenzen hier: Was ist der Unterschied? zwischen einer weichen Referenz und einer schwachen Referenz in Java? und Grundlegendes zu Java-Referenzklassen: SoftReference, WeakReference und PhantomReference

    
Francisco Spaeth 11.06.2012 12:51
quelle
0

Sie können anrufen:

%Vor%

Aber wenn Sie das tun, stören Sie sich an der JVM-Laufzeit. Wenn Sie referenz auf null setzen, ist das Objekt immer noch vorhanden, seine Referenz bezieht sich nicht auf dieses Objekt, und wenn GC das nächste Mal aufgerufen wird, zerstört es das Objekt (es sei denn, andere Referenzen verweisen darauf).

>     
David Rasuli 11.06.2012 12:56
quelle
0

Nein, der obige Code ist nicht gültig. Der Verweis this einer Klasse dauert nur so lange, wie die JVM ausgeführt wird. Wenn Sie this == null setzen, erhalten Sie einen Kompilierfehler, denn obwohl this als Referenz bezeichnet wird, handelt es sich tatsächlich um einen Wert, und Sie können nichts einem Wert zuweisen.

Auch ist es unnötig, da this nur so lange gültig ist, wie die Ausführung in diesem Code ist und GC kein Objekt anfordern kann, das noch ausgeführt wird. Sobald jedoch die Ausführung für das Objekt endet, geht auch this verloren und das Objekt wird automatisch für GC verfügbar (d. H. Wenn keine andere Referenz auf das Objekt existiert)

    
WickeD 11.06.2012 13:01
quelle
0

Dies ist ein Kompilierungsfehler. Sie können NULL diesem nicht zuweisen. Das Schlüsselwort 'this' kann auf der rechten Seite von equals verwendet werden (mit der Ausnahme, dass die linke Hand nicht NULL ist. Grund: Nichts kann null zugewiesen werden).

Für die Zerstörung, in Java, haben Sie einen GC, der diese Arbeit hinter den Kulissen für Sie erledigen kann.

Bitte beachten Sie, dass Sie für benutzerdefinierte Objekte immer noch etwas wie -

tun können %Vor%

Allerdings kann 'this' nicht auf der linken Seite von equals verwendet werden.

    
Ashish K Agarwal 11.06.2012 13:05
quelle
0

Der Grund, warum der Ausführungsthread innerhalb der destruct () -Methode ist, sagt mir, dass es einen Aufrufer gibt, der eine Referenz auf diese Instanz der Klasse A hält. Also kann man nichts tun wie "this = null" in Java - es hätte nicht geholfen, obwohl es in Java erlaubt war. Sie können Objekte in Java nicht zerstören.

    
Makarand Kashikar 25.06.2013 02:16
quelle