Pas de destruction explicite d’objets en Java
Je tiens à préciser que je n’y connais pas grand chose à la programmation Java. Mais je revendique et revendiquerai toujours le droit de me mêler de ce qui ne me regarde pas. J’espère qu’un commentateur avisé dans les techniques de programmation Java me démontrera le contraire de ce que j’avance dans ce texte de façon péremptoire ! ;+)
A la manière d’un philosophe bouddhiste qui nous rappellerait l’évidence selon laquelle « Qui avale une noix de coco doit faire confiance à son anus« , l’informaticien sceptique ne peut que s’interroger sur la foi aveugle que les programmeurs Java – ou C# – ont dans le Garbage Collector. Les fuites mémoire sous Java – ou C# – ne seraient donc que l’œuvre d’esprits malfaisants (mal faisant ???).
Java ne proposerait donc pas de « méthode » pour la destruction explicite d’un objet, en dehors d’un Finalize – qui ne concerne pas l’objet lui-même – dans lequel vous avez intérêt à ne pas oublier de « nettoyer » l’utilisation de ressources externes que la JVM est incapable de libérer par nature (ouverture de sockets ou de fichiers par exemple). L’affectation de la valeur nulle à un objet ne libère pas la mémoire pour autant et n’appelle en aucun cas la méthode Finalize. Vous pouvez toujours essayer d’invoquer le Garbage Collector, qui a hélas le défaut d’être global à la JVM ! Mais je ne suis pas sûr que cela soit réellement utile.
Vous comprendrez aisément pourquoi je ne serai jamais tenté par Java.
La classe MonMessage
Pour faire le test, je compile le fichier MonMessage.java : javac MonMessage.java. Il faut installer la JDK.
public class MonMessage { public void Afficher(String strMsg) { System.out.println(strMsg); } public void finalize() { System.out.println("My only friend, the end"); } }
La classe HelloTheWorld
Je compile également le fichier HelloTheWorld.java. Je l’exécute grâce à java HelloTheWorld.java.
public class HelloTheWorld { public static void main(String[] args) { MonMessage oMonMessage=new MonMessage(); oMonMessage.Afficher("Hello the World"); oMonMessage=null; System.gc(); } }