IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Java Discussion :

Plusieurs objets instanciés, un seul nom ?


Sujet :

Java

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 18
    Par défaut Plusieurs objets instanciés, un seul nom ?
    Bonjour !

    Je manipule un morceau de code avec une instanciation d'objet (un Widget Text de la lib SWT) dans une boucle. On a donc un truc du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for (i=0; i<100; i++)
       {Text texte = new Text(table, SWT.NONE);}
    Tous les objets sont instanciés mais possèdent le même nom. Alors bon ça ne me choque pas que Java s'en sorte au niveau de la JVM, mais comment fait le programmeur pour accéder à ces objets ?

    Exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for (i=0; i<100; i++)
       {Text texte = new Text(table, SWT.NONE);}
    texte.dispose();
    Il va me supprimer (c'est le but de la fonction dispose) le dernier widget Text créé. Comment puis-je faire si je veux tous les supprimer par exemple ? Je sais qu'une solution serait de créer un tableau ou un vector, mais j'aimerais savoir s'il est possible de les accéder de cette manière.

    Merci d'avance !

  2. #2
    Membre Expert Avatar de Ivelios
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juillet 2008
    Messages
    1 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 031
    Par défaut
    Bonjour,

    à ma connaissance tu es obligé de stocker les références vers les Objets quelque part si tu souhaites les réutiliser ensuite.

    Donc comme tu le proposais : tableau, list, ...

    a+

    Ivelios

  3. #3
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Mars 2008
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2008
    Messages : 70
    Par défaut
    Bonjour ,


    A priori je pense que java réécrit dans la même adresse mémoire tes nouveaux objets qui sont tous complétement identique.

    De plus ne devrait pas fonctionner car texte est instancier dans la boucle de manière locale.

    si tu fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Texte text = null  ; 
     
    for ( int i =0 ; i < 100 ; i++ ){
    text = new Text(de ce que tu veux ) ; 
    } 
     
    texte.dispose();
    là le texte.dispose() fonctionnera pour l'objet se trouvant à l'adresse memoire de texte. Si eventuellement d'autres instances ont été crée ( je doute fort la desus ) le grabber collector s'en chargera


    Edit : J'espère que je te dit pas de bêtises, j'espère qu'un autre membre pourra confirmer

  4. #4
    Membre Expert
    Inscrit en
    Mai 2006
    Messages
    1 364
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 1 364
    Par défaut
    Tu n'as pas le choix, si tu veux conserver une référence, il faut la stocker quelque part. Ca peut etre dans un tableau ou dans un array. Mais en général, quand on instancie des Labels, c'est pour les inclure dans une fenetre. donc la référence sera concervée dans celle-ci et, en général, elle fournit une interface qui permet de retrouver l'ensemble des éléments qui lui ont été ajoutés.
    Mais il est mieux de garder ta propre liste car ca t'evitera d'avoir à te demander, lorsque tu recupereres l'ensemble des composants graphiques de la fenetre, si c'est un Text qui vient de ta procedure ou d'ailleurs.

    Sinon, pour reprendre le code que tu donnes, à chaque nouvelle instanciation, la référence sur l'instance est perdue. Autrement dit, l'objet est détruit et, s'il y a un besoin mémoire, le garbage collector va venir récupérer la mémoire allouée. Bref, pour résumer, le code que tu as posté ne correspond probablement pas à un code qui marche. D'ou est ce qu'il sort ?

  5. #5
    Membre Expert
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    Par défaut
    Citation Envoyé par ramoucho75020 Voir le message
    Bonjour ,


    A priori je pense que java réécrit dans la même adresse mémoire tes nouveaux objets qui sont tous complétement identique.
    [...]
    Edit : J'espère que je te dit pas de bêtises, j'espère qu'un autre membre pourra confirmer
    En fait, dès qu'on fait "New", ça veut bien dire qu'on crée un objet nouveau, même s'il a les même valeurs ... Par ailleurs, au niveau GC, ici les objets créés sont stockés au niveau de l'objet parent (table). Ils ne sont donc pas collectable.

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 18
    Par défaut
    @hwoarang
    Il sort d'un exemple beaucoup plus complexe que j'ai essayé de simplifier au maximum. J'ai probablement trop simplifié si tu dis que ça ne fonctionne pas, mais en réalité ça fonctionne !

    Merci pour vos réponses.

  7. #7
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 577
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 577
    Par défaut
    Citation Envoyé par hwoarang Voir le message
    Sinon, pour reprendre le code que tu donnes, à chaque nouvelle instanciation, la référence sur l'instance est perdue. Autrement dit, l'objet est détruit et, s'il y a un besoin mémoire, le garbage collector va venir récupérer la mémoire allouée. Bref, pour résumer, le code que tu as posté ne correspond probablement pas à un code qui marche. D'ou est ce qu'il sort ?
    Si, si, là le constructeur exige qu'on lui dise dans quel élément parent le Text doit être inséré. Par conséquent, cet élément parent garde une référence vers le nouvel élément créé. C'est mal, oui, ça veut dire que le constructeur leak un this vers l'objet avant sa fin, mais SWT fonctionne comme ça.

    D'ailleurs, on peut utiliser cela pour demander au parent de lister tous les Text qu'il contient. Mais ce n'est pas pratique, car l'ordre, et plus grave, la sémantique, ne sont pas garantis. Il vaut mieux les mettre dans une List<Text>.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  8. #8
    Membre Expert
    Inscrit en
    Mai 2006
    Messages
    1 364
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 1 364
    Par défaut
    Citation Envoyé par thelvin Voir le message
    Si, si, là le constructeur exige qu'on lui dise dans quel élément parent le Text doit être inséré. Par conséquent, cet élément parent garde une référence vers le nouvel élément créé. C'est mal, oui, ça veut dire que le constructeur leak un this vers l'objet avant sa fin, mais SWT fonctionne comme ça.
    Ah oui, j'avais pas fait attention à "table" qui est passé au texte. C'est... original comme fonctionnement...

    Mais la remarque que j'ai faite est quand meme valable. Si tu ne veux pas t'embeter à stocker tes textes toi meme (ce qui est quand meme le mieux), tu peux probablement lister les composants dans "table" et recuperer tes textes.

Discussions similaires

  1. Plusieurs objets en une seule boucle
    Par austin57 dans le forum Général Python
    Réponses: 3
    Dernier message: 13/02/2014, 22h26
  2. [AC-2003] Envoi de plusieurs objets via une seule macro
    Par Skoat dans le forum Access
    Réponses: 9
    Dernier message: 03/11/2009, 16h42
  3. [WPF-Blend] Plusieurs objets mais une seule animation
    Par Tuizi dans le forum Framework .NET
    Réponses: 12
    Dernier message: 11/12/2007, 17h10
  4. Réponses: 3
    Dernier message: 07/01/2007, 16h48
  5. Réponses: 13
    Dernier message: 25/01/2005, 10h05

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo