[Lire Java efficace] Chapitre 2 Item 7 "Eviter les finaliseurs"

Évitez les finaliseurs

Les finaliseurs sont imprévisibles, généralement dangereux et généralement inutiles. Il existe des moyens efficaces de l'utiliser, mais en gros, il vaut mieux ne pas l'utiliser.

Glossaire

Finalisateur

La méthode finalize (). La méthode finalize () est définie dans la classe java.lang.Object, qui est la source d'héritage pour toutes les classes du langage Java. Autrement dit, chaque classe a une méthode finalize (). Une méthode appelée lorsque le garbage collector s'exécute.

Homologue natif

Un objet natif qu'un objet régulier délègue via une méthode native. Puisqu'il ne s'agit pas d'un objet normal, le garbage collector n'en est pas conscient et ne peut pas récupérer le pair natif lorsque l'objet normal est récupéré.

Chaînage du finaliseur

Si une classe a un finaliseur et qu'une sous-classe le remplace, le finaliseur de cette sous-classe doit appeler manuellement le finaliseur de la superclasse (Exemple 2).

Gardien du finalisateur

Si un implémenteur de sous-classe remplace un finaliseur de superclasse et oublie d'appeler le finaliseur de superclasse, le finaliseur de superclasse ne sera jamais appelé. Les tuteurs de finaliseur sont efficaces pour se protéger contre de telles sous-classes imprudentes ou malveillantes (exemple 3).

Exemple de code

Exemple 1



//Essayez de garantir l'exécution de la méthode de fin-enfin bloquer
Foo foo = new Foo(...);
try {
    //Fais ce que tu as à faire avec foo
    ...
} finally {
    foo.terminate(); //Méthode de terminaison explicite
}

Exemple 2


//Chaîne de finaliseur manuel
@Override protected void finalize() throws Throwable {
    try {
        ... //Traitement du finaliseur de sous-classe
    } finally {
        super.finalize();
    }
}

Exemple 3


//Idiome du gardien finalisateur
public class Foo {
    //Le seul but de cet objet est de finaliser l'objet extérieur Foo
    private final Object finalizerGuardian = new Object() {
        @Override protected void finalize() throws Throwable {
            ... //Finaliser l'objet Foo externe
        }
    };
    ... //Le reste est omis
}

Deux inconvénients du finaliseur

Tout d'abord, il n'y a aucune garantie que le finaliseur sera exécuté immédiatement.

• Vous ne devez pas effectuer de tâches urgentes dans le finaliseur, car le temps nécessaire à l'exécution du finaliseur peut être de n'importe quelle durée. • Ne comptez jamais sur les finaliseurs pour mettre à jour les états persistants critiques

Deuxièmement, il y a une sérieuse pénalité de performance pour l'utilisation du finaliseur

La création et la libération d'objets avec les finaliseurs sont environ 430 fois plus lentes que les objets sans finaliseurs

Quelle implémentation dois-je faire au lieu d'écrire un finaliseur?

-Fournir une méthode de terminaison explicite (Exemple 1) · Les méthodes de terminaison explicite sont souvent utilisées avec la syntaxe try-finally pour garantir l'arrêt

Si le finaliseur est activé

Premièrement, lorsque le propriétaire de l'objet oublie d'appeler la méthode de terminaison explicite, il se comporte comme un "filet de sécurité".

Deuxièmement, lors de la collecte de pairs natifs

Continuer

[Lire Java efficace] Chapitre 3 Point 8 "Lorsque vous remplacez égal, suivez le contrat général" https://qiita.com/Natsukii/items/bcc5846dbfa69bfda9b0

Recommended Posts

[Lire Java efficace] Chapitre 2 Item 7 "Eviter les finaliseurs"
[Lire Java efficace] Chapitre 3 Item 10 "Always Override toString"
[Lire Java efficace] Chapitre 2 Item 5 "Eviter la création d'objets inutiles"
[Lire Java efficace] Chapitre 2 Item 6 "Supprimer les références d'objets obsolètes"
Efficace Java Chapitre 2
Effective Java Chapitre 6 34-35
Effective Java Chapitre 4 15-22
Java efficace Chapitre 3
[Lire Java efficace] Chapitre 2 Item 4 "Forcer l'impossibilité d'immobilisation avec un constructeur privé"
[Lire Java effectif] Chapitre 3 Rubrique 9 "Lors de la substitution d'égaux, toujours remplacer hashCode"
[Lire Java efficace] Chapitre 2 Item 1 "Considérez les méthodes de fabrique statiques plutôt que les constructeurs"
[Lire Java efficace] Chapitre 3 Point 8 "En cas de remplacement égal, suivez le contrat général"
[Lire Java efficace] Chapitre 2 Item 3 "Forcer les caractéristiques de singleton avec un constructeur privé ou un type enum"
Efficacité de Java 3rd Edition Chapitre 5 Génériques
Méthodes efficaces du chapitre 8 de Java 3rd Edition
[Java efficace] Évitez de créer des objets inutiles
[Lire le Java efficace] Chapitre 2 Item 2 "Considérez un constructeur face à un grand nombre de paramètres de constructeur"
Effective Java 3rd Edition Chapitre 9 Programme Général
Enum et annotations du chapitre 6 de Java 3rd Edition efficace
Efficace Java 3e édition Chapitre 7 Lambda et Stream
Effective Java 3rd Edition Chapitre 2 Création et disparition d'objets
Java Performance Chapitre 1 Introduction
Lire JSON en Java
Point 79: éviter une synchronisation excessive
Lire le fichier de propriétés Java
3ème résumé efficace de Java
Lire la source Java HashMap
Modèle de générateur (Java effectif)
Java Performance Chapitre 3 Boîte à outils Java Performance
Efficace Java 3rd Edition Chapitre 3 Méthodes communes à tous les objets