Finalizer sind unvorhersehbar, normalerweise gefährlich und werden im Allgemeinen nicht benötigt. Es gibt einige effektive Möglichkeiten, es zu verwenden, aber im Grunde ist es besser, es nicht zu verwenden.
Die finalize () -Methode. Die finalize () -Methode ist in der Klasse java.lang.Object definiert, die die Vererbungsquelle für alle Klassen in der Java-Sprache darstellt. Das heißt, jede Klasse hat eine finalize () -Methode. Eine Methode, die aufgerufen wird, wenn der Garbage Collector ausgeführt wird.
Ein natives Objekt, das ein reguläres Objekt über eine native Methode delegiert. Da es sich nicht um ein reguläres Objekt handelt, ist sich der Garbage Collector nicht bewusst und kann den nativen Peer nicht abrufen, wenn das reguläre Objekt abgerufen wird.
Wenn eine Klasse einen Finalizer hat und eine Unterklasse diesen überschreibt, muss der Finalizer für diese Unterklasse den Finalizer für die Oberklasse manuell aufrufen (Beispiel 2).
Wenn ein Unterklassenimplementierer einen Superklassen-Finalizer überschreibt und vergisst, den Superklassen-Finalizer aufzurufen, wird der Superklassen-Finalisierer niemals aufgerufen. Finalizer Guardians schützen wirksam vor solchen nachlässigen oder böswilligen Unterklassen (Beispiel 3).
Beispiel 1
//Versuchen Sie, die Ausführung der Endmethode zu gewährleisten-endlich blockieren
Foo foo = new Foo(...);
try {
//Mach was du mit foo zu tun hast
...
} finally {
foo.terminate(); //Explizite Beendigungsmethode
}
Beispiel 2
//Manuelle Finalisierkette
@Override protected void finalize() throws Throwable {
try {
... //Verarbeitung des Finalisierers der Unterklasse
} finally {
super.finalize();
}
}
Beispiel 3
//Finalizer Guardian's Idiom
public class Foo {
//Der einzige Zweck dieses Objekts besteht darin, das äußere Foo-Objekt fertigzustellen
private final Object finalizerGuardian = new Object() {
@Override protected void finalize() throws Throwable {
... //Finalisieren Sie das äußere Foo-Objekt
}
};
... //Der Rest entfällt
}
• Sie sollten im Finalizer keine zeitkritischen Schritte ausführen, da die Ausführung des Finalizers beliebig lange dauern kann. • Verlassen Sie sich niemals auf Finalizer, um kritische persistente Zustände zu aktualisieren
Das Erstellen und Freigeben von Objekten mit Finalisierern ist etwa 430-mal langsamer als das Erstellen von Objekten ohne Finalisierer
[Read Effective Java] Kapitel 3 Punkt 8 "Wenn Sie gleich überschreiben, befolgen Sie den allgemeinen Vertrag" https://qiita.com/Natsukii/items/bcc5846dbfa69bfda9b0
Recommended Posts