Java Language méthode finalize ()


Exemple

C'est une méthode protégée et non statique de la classe Object . Cette méthode est utilisée pour effectuer certaines opérations finales ou pour effectuer des opérations de nettoyage sur un objet avant qu'il ne soit supprimé de la mémoire.

Selon le document, cette méthode est appelée par le ramasse-miettes sur un objet lorsque la récupération de la mémoire détermine qu'il n'y a plus de références à l'objet.

Mais il n'y a aucune garantie que la méthode finalize() soit appelée si l'objet est toujours accessible ou si aucun récupérateur de place n'est exécuté lorsque l'objet devient éligible. C'est pourquoi il vaut mieux ne pas compter sur cette méthode.

Dans les librairies Java, des exemples d'utilisation ont pu être trouvés, par exemple dans FileInputStream.java :

protected void finalize() throws IOException {
    if ((fd != null) &&  (fd != FileDescriptor.in)) {
        /* if fd is shared, the references in FileDescriptor
         * will ensure that finalizer is only called when
         * safe to do so. All references using the fd have
         * become unreachable. We can call close()
         */
        close();
    }
}

Dans ce cas, c'est la dernière chance de fermer la ressource si cette ressource n'a pas encore été fermée.

En général, l'utilisation de la méthode finalize() dans des applications de toute nature est considérée comme une mauvaise pratique et devrait être évitée.

Les finaliseurs ne sont pas destinés à libérer des ressources (par exemple, la fermeture de fichiers). Le ramasse-miettes est appelé lorsque (si!) Le système manque de place sur le tas. Vous ne pouvez pas compter sur elle pour être appelée lorsque le système est à court de descripteurs de fichiers ou pour toute autre raison.

Le cas d'utilisation prévu pour les finaliseurs concerne un objet sur le point d'être récupéré pour notifier un autre objet de son sort imminent. Un meilleur mécanisme existe maintenant à cet effet - la classe java.lang.ref.WeakReference<T> . Si vous pensez avoir besoin d'écrire une méthode WeakReference finalize() , alors vous devriez vérifier si vous pouvez résoudre le même problème en utilisant WeakReference place. Si cela ne résout pas votre problème, vous devrez peut-être repenser votre conception à un niveau plus profond.

Pour plus de lecture, voici un article sur la méthode finalize() du livre "Effective Java" de Joshua Bloch.