Finaliseur

page supérieure      page suivante     

Un objet ou un tableau alloué dans un programme Java et qui se trouve ne plus être référencé (c'est-à-dire tel qu'aucune variable du programme ne contient l'adresse de cet objet ou tableau) ne peut plus servir dans le programme en cours d'exécution.

Le langage Java utilise un ramasse-miettes (garbage collector en anglais, quelquefois abrégé en gc), processus de basse priorité qui de temps à autre recherche quels sont les objets ou tableaux qui ne sont plus référencés, et libère alors l'espace en mémoire alloué à ceux-ci.

Un objet peut bloquer d'autres types de ressources que de l'espace en mémoire, comme un descripteur de fichier ou une socket. On peut utiliser un finaliseur pour libérer ce type de ressource. Le finaliseur est une méthode qui redéfinit la méthode :
    protected void finalize() {}
de la classe Object.
Lorsque le ramasse-miettes découvre qu'un objet n'est plus référencé, il lui applique la méthode finalize() de cet objet avant de libérer l'espace en mémoire alloué à à cet objet . Il est possible que dans le corps de la méthode finalize(), il y ait une instruction telle que :
    unObjet = this;
qui ressuscite en quelque sorte l'objet qui n'était plus référencé, c'est pourquoi l'espace en mémoire alloué à l'objet ne sera en fait libéré qu'après une nouvelle vérification du fait qu'il n'est pas référencé.

L'exemple ci-dessous utilise un fichier, thème qui sera abordé ultérieurement ; vous pouvez vous contenter d'obsever la façon de définir un finaliseur. Ne vous inquiétez pas de ce que, ici, le finaliseur n'aura pas l'occasion d'être exécuté.

L'objectif principal du programme est d'écrire le mot "bonjour" dans un fichier dont le nom est indiqué sur la ligne de commande. Il est toujours important de fermer un fichier qui a été ouvert en utilisant la méthode close, ce qui est fait dans le programme ci-dessous.
Le mot protected correspond à un niveau de visibilité qui sera étudié plus tard.
Pour l'objectif de cette page, il y a juste à observer l'existence de la méthode finalize et à savoir que si, dans un programme plus élaboré, l'objet ouvrage du main se trouvait ne plus être référencé, et donc ne pourrait plus être utilisé par le programme en cours d'exécution, le ramasse-miettes, à son passage, invoquerait la méthode finalize avant de libérer l'espace-mémoire occupé par ouvrage.

import java.io.PrintWriter;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.FileNotFoundException;

class BienFerme {
PrintWriter livre;

BienFerme(String nom) throws FileNotFoundException {
livre = new PrintWriter(new FileOutputStream(nom));
}

protected void finalize() {
if (livre != null) livre.close();
}
}

class EssaiFinaliseur {
public static void main(String arg[]) throws FileNotFoundException {
BienFerme ouvrage = new BienFerme(arg[0]);
ouvrage.livre.println("bonjour");
ouvrage.livre.close();
}
Pour accéder à EssaiFinaliseur.java


© Charon Irène Télécom ParisTech 2011