OVH Cloud OVH Cloud

supprimer une variable?

4 réponses
Avatar
Alex
Il n'existe pas en java de mot clef "delete" comme en c/c++ pour
supprimer une variable (vive le garbage collector qui gère tout).

Cependant je me heurte à un léger problème (qui vient sans doute de
l'utilisation des swing)

Mon code simplifié est le suivant:

class Toto {
private class Gui {
Gui() {
_frame = new JFrame();
...
_frame.setVisible(true);
}
private JFrame _frame;
}

Toto() {
_gui = new Gui();
}
private Gui _gui;


static void test() {
Toto toto = new Toto();
}

static void main() {
test();
test();
}
}


Quand j'execute ce code, j'obtiens l'affichage de 2 fenetres.
Or quand la fonction test() se termine, la variable toto de cette
fonction n'est plus utilisée, et devrait donc être supprimée, et donc
aussi l'interface graphique et tout.
Mais non!!!

Comment faire en sorte que ca supprime tout?
J'ai essayé de metrte toto = null; juste avant de sortir de la fonction
test(), mais ca n'y change rien.

Merci

--
Alex

4 réponses

Avatar
Insitu
Bonjour,

Alex writes:
Il n'existe pas en java de mot clef "delete" comme en c/c++ pour
supprimer une variable (vive le garbage collector qui gère tout).


Une variable n'est jamais "supprimée", en tout cas pas en c++ ni en java.
La destruction explicite du c++ (et le free du c) "suppriment" l'objet représenté
par la variable.

Cependant je me heurte à un léger problème (qui vient sans doute de
l'utilisation des swing)

Mon code simplifié est le suivant:

class Toto {
private class Gui {
Gui() {
_frame = new JFrame();
...
_frame.setVisible(true);
}
private JFrame _frame;
}

Toto() {
_gui = new Gui();
}
private Gui _gui;


static void test() {
Toto toto = new Toto();
}

static void main() {
test();
test();
}
}


Quand j'execute ce code, j'obtiens l'affichage de 2 fenetres.
Or quand la fonction test() se termine, la variable toto de cette
fonction n'est plus utilisée, et devrait donc être supprimée, et donc
aussi l'interface graphique et tout.
Mais non!!!


Eh non :-) Le fait d'utiliser l'interface graphique swing (ou plutôt awt)
crée un fil d'exécution (un Thread) AWTEventThread. Quand main se termine,
ce fil qui n'est pas en mode daemon continue de s'exécuter donc l'application
fonctionne encore.


Comment faire en sorte que ca supprime tout?


dispose() par exemple, ou fermer les fenêtres.


Merci


de rien

insitu.

Avatar
Xavier Tarrago
Une fenêtre est un objet persistant tant qu'elle a des ressources du
système de fenêtrage de l os associées (peer). Cela permet de créer des
fenêtres qui ont leur propre comportement (listeners attachés) et qui vivent
à l'écran sans qu'il soit besoin de garder des références sur elles. La
méthode dispose() des fenêtres de haut niveau (JFrame, JDialog, ...) permet
de désallouer les ressources graphiques de l'os et de rendre la fenêtre
disponible pour le garbage collector. En pratique, j'ai remarqué que la
finalisation n'intervient pas de suite comme si swing gardait une ou deux
fenêtres en réserve pour les réutiliser.

Pour tester tout cela,
- faire une fenetre dérivée de JFrame pour laquelle finalize() écrit un
message sur System.err
- setVisible(true) l'affiche
- setVisible(false) + dispose + mettre la ou les référence à null
Recommencer pour plusieurs fenetres...


"Alex" a écrit dans le message de
news:446ce049$0$8126$
Il n'existe pas en java de mot clef "delete" comme en c/c++ pour
supprimer une variable (vive le garbage collector qui gère tout).

Cependant je me heurte à un léger problème (qui vient sans doute de
l'utilisation des swing)

Mon code simplifié est le suivant:

class Toto {
private class Gui {
Gui() {
_frame = new JFrame();
...
_frame.setVisible(true);
}
private JFrame _frame;
}

Toto() {
_gui = new Gui();
}
private Gui _gui;


static void test() {
Toto toto = new Toto();
}

static void main() {
test();
test();
}
}


Quand j'execute ce code, j'obtiens l'affichage de 2 fenetres.
Or quand la fonction test() se termine, la variable toto de cette
fonction n'est plus utilisée, et devrait donc être supprimée, et donc
aussi l'interface graphique et tout.
Mais non!!!

Comment faire en sorte que ca supprime tout?
J'ai essayé de metrte toto = null; juste avant de sortir de la fonction
test(), mais ca n'y change rien.

Merci

--
Alex


Avatar
TestMan
Bonjour,

Pour compléter l'explication de Xavier, tu peux aller sur :
http://java.sun.com/j2se/1.5.0/docs/api/java/awt/doc-files/AWTThreadIssues.html

A+

TM

Il n'existe pas en java de mot clef "delete" comme en c/c++ pour
supprimer une variable (vive le garbage collector qui gère tout).

Cependant je me heurte à un léger problème (qui vient sans doute de
l'utilisation des swing)

Mon code simplifié est le suivant:

class Toto {
private class Gui {
Gui() {
_frame = new JFrame();
...
_frame.setVisible(true);
}
private JFrame _frame;
}

Toto() {
_gui = new Gui();
}
private Gui _gui;


static void test() {
Toto toto = new Toto();
}

static void main() {
test();
test();
}
}


Quand j'execute ce code, j'obtiens l'affichage de 2 fenetres.
Or quand la fonction test() se termine, la variable toto de cette
fonction n'est plus utilisée, et devrait donc être supprimée, et donc
aussi l'interface graphique et tout.
Mais non!!!

Comment faire en sorte que ca supprime tout?
J'ai essayé de metrte toto = null; juste avant de sortir de la fonction
test(), mais ca n'y change rien.

Merci



Avatar
said.rabie
je rajoute un petit truc :)

private class Gui {
Gui() {
_frame = new JFrame();
...
_frame.setVisible(true);
}
private JFrame _frame;
}
.....

pourquoi private JFrame frame;
pourquoi stoké la frame comme champs de la class

la metre en variable local sufirai bien en plus le chargement des
champs est un peu long
donc :

private class Gui {
Gui() {
final JFrame _frame = new JFrame(); // final pour plus de
rapiditer
...
_frame.setVisible(true);
}

}