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.
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.
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é.
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).
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 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
}
• 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
La création et la libération d'objets avec les finaliseurs sont environ 430 fois plus lentes que les objets sans finaliseurs
-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
[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