[Read Effective Java] Kapitel 2 Punkt 7 "Vermeiden Sie Finalizer"

Vermeiden Sie Finalizer

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.

Glossar

Finalizer

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.

Native Peer

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.

Finalizer-Verkettung

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).

Finalizer Wächter

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).

Beispielcode

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
}

Zwei Nachteile des Finalisierers

Erstens gibt es keine Garantie dafür, dass der Finalizer sofort ausgeführt wird.

• 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

Zweitens gibt es eine schwerwiegende Leistungsstrafe für die Verwendung des Finalizers

Das Erstellen und Freigeben von Objekten mit Finalisierern ist etwa 430-mal langsamer als das Erstellen von Objekten ohne Finalisierer

Welche Implementierung sollte ich tun, anstatt einen Finalizer zu schreiben?

Wenn der Finalizer aktiviert ist

Erstens, wenn der Eigentümer des Objekts vergisst, die explizite Beendigungsmethode aufzurufen, verhält es sich wie ein "Sicherheitsnetz".

Zweitens beim Sammeln von einheimischen Kollegen

Fortsetzen

[Read Effective Java] Kapitel 3 Punkt 8 "Wenn Sie gleich überschreiben, befolgen Sie den allgemeinen Vertrag" https://qiita.com/Natsukii/items/bcc5846dbfa69bfda9b0

Recommended Posts

[Read Effective Java] Kapitel 2 Punkt 7 "Vermeiden Sie Finalizer"
[Read Effective Java] Kapitel 3 Punkt 10 "Immer toString überschreiben"
[Read Effective Java] Kapitel 2 Punkt 5 "Vermeiden Sie die Erstellung unnötiger Objekte"
[Read Effective Java] Kapitel 2 Punkt 6 "Veraltete Objektreferenzen entfernen"
Effektives Java Kapitel 2
Effektives Java Kapitel 6 34-35
Effektives Java Kapitel 4 15-22
Effektives Java Kapitel 3
[Read Effective Java] Kapitel 2 Punkt 4 "Unmöglichkeit der Instanziierung mit privatem Konstruktor erzwingen"
[Read Effective Java] Kapitel 3 Punkt 9 "Wenn Sie equals überschreiben, überschreiben Sie immer hashCode"
[Read Effective Java] Kapitel 2 Punkt 1 "Betrachten Sie statische Factory-Methoden anstelle von Konstruktoren"
[Read Effective Java] Kapitel 3 Punkt 8 "Wenn Sie gleich überschreiben, befolgen Sie den allgemeinen Vertrag"
[Read Effective Java] Kapitel 2 Punkt 3 "Singleton-Eigenschaften mit privatem Konstruktor oder Aufzählungstyp erzwingen"
Effektive Java 3rd Edition Kapitel 5 Generika
Effektive Java 3rd Edition Kapitel 8 Methoden
[Effektives Java] Vermeiden Sie das Erstellen unnötiger Objekte
[Read Effective Java] Kapitel 2 Punkt 2 "Betrachten Sie einen Builder, wenn Sie mit einer großen Anzahl von Konstruktorparametern konfrontiert werden."
Effektives Java 3rd Edition Kapitel 9 Programm Allgemein
Effektive Java 3rd Edition Kapitel 6 Aufzählung und Anmerkungen
Effektive Java 3rd Edition Kapitel 7 Lambda und Stream
Effektive Java 3rd Edition Kapitel 2 Objekterstellung und Verschwindenlassen
Java-Leistung Kapitel 1 Einführung
Lesen Sie JSON in Java
Punkt 79: Vermeiden Sie übermäßige Synchronisation
Java-Eigenschaftendatei lesen
effektive Java 3. Zusammenfassung
Lesen Sie die Java HashMap-Quelle
Builder-Muster (effektives Java)
Java Performance Kapitel 3 Java Performance Toolbox
Effektive Java 3rd Edition Kapitel 3 Allen Objekten gemeinsame Methoden