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 ! ;+)


Qui avale du code Java doit faire confiance à son Garbage Colelctor !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();
    }
}

Dsfc Dsfc

Pas de destruction explicite d’objets en Java
5 votes, 4.20 avg. rating (85% score)
Tags : , , , , , ,
Commentaires

proposition de modification de la classe :
public static void main(String[] args) {
System.out.println(« main – New »);
MonMessage oMonMessage=new MonMessage();
System.out.println(« main – afficher »);
oMonMessage.Afficher(« Hello the World »);
System.out.println(« main – null »);
oMonMessage=null;
System.out.println(« main – System.gc »);
System.gc();
System.out.println(« main – END »);
}
ce qui donne la trace suivante
main – New
main – afficher
Hello the World
main – null
main – System.gc
main – END
My only friend, the end

ce qui est plus clair dans le déroulement de la fin….

Merci. L’objet de ce billet est de montrer l’impossibilité en JAVA de détruire « manuellement » des objets.

Laisser un commentaire

(requis)

(requis)


*