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

Langage Java Discussion :

Portée et allocation des variables dans les boucles


Sujet :

Langage Java

  1. #1
    Membre du Club
    Inscrit en
    Mai 2009
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 27
    Points : 62
    Points
    62
    Par défaut Portée et allocation des variables dans les boucles
    Bonjour,

    Je viens de résoudre un problème d'affectation des variables dans une boucle for, et je me rends compte que je ne suis pas certain de comprendre ce qui se passe à 100%. Voici la boucle d'origine :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for(ObjetAssure objetAssure : listeObjetAssure){
    		final ObjetAssure oA2 = objetAssureService.findById(objetAssure.getId());
    		objetAssure = oA2;
     
    }
    Pour le contexte, la méthode appelée par le service se contente de retourner un nouvel objet eager alors que les objets de la liste sont lazy loaded via hibernate. Le problème était qu'à la sortie de la boucle les objets contenus dans la liste étaient inchangés.

    Si je me contente par contre de simplement changer un attribut de l'objetAssure, il n'y a aucun problème, j'obtiens bien le résultat attendu, avec chaque élément de la liste modifié correctement.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for(ObjetAssure objetAssure : listeObjetAssure){
    		objetAssure.setNumeroChrono("100");
    }

    J'ai résolu le problème avec la boucle suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for(int i = 0; i < listeObjetAssure.size(); i++){
    		final ObjetAssure oA2 = objetAssureService
    				.findById(listeObjetAssure.get(i).getId());
    		listeObjetAssure.set(i, oA2);
    }
    J'affecte ici directement l'objet retourné par le service dans la liste sans passer par un objet créé par la boucle de type foreach et ma liste est bien modifiée à la sortie de la boucle.

    Je pensais que l'objetAssure de la boucle for pointait exactement à l'adresse de chaque objet de la liste et que par conséquent si j'affectais un nouvel objet à cette référence les objets contenus dans la liste seraient eux aussi modifiés. Visiblement mon raisonnement était faux, c'est pourquoi je fais appel à vos services pour m'éclairer quelque peu sur la portée et l'allocation des variables dans les boucles. Ce qui me perturbe le plus est le fait que ce raisonnement marche pour la modification d'attributs de l'objet mais pas pour la réaffectation complète de l'objet.

    A noter que j'obtiens exactement les mêmes comportement avec des iterateurs explicites tels que :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    final Iterator<ObjetAssure> i = listeObjetAssure.iterator();
    while(i.hasNext()){
    		ObjetAssure objetAssure = i.next();
    		final ObjetAssure oA2 = objetAssureService.findById(objetAssure.getId());
    		objetAssure = oA2;
    }
    Cordialement.

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Salut,

    les variables java sont des pointeurs (on dit plutôt référence en java), mais modifier le contenu d'une variable ne modifie pas l'instance d'objet pointée, mais uniquement le contenu de la variable, donc elle ne fait que pointer vers une nouvelle instance d'objet.

    Ainsi après l'éxécution de ce code,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Object o1=new Object(); // instance 1
    o1=new Object(); // instance 2
    l'instance 1 n'est pas remplacée en mémoire par l'instance 2. C'est juste que o1 contient la référence de l'instance 2 et non plus celle de l'instance 1 qu'elle contenait lorsqu'on l'a initialisée.

    de même que

    ne fait pas que 2 prenne la valeur de 3 ! (heureusement )
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  3. #3
    Membre du Club
    Inscrit en
    Mai 2009
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 27
    Points : 62
    Points
    62
    Par défaut
    Merci beaucoup. J'avais complètement oublié de brancher mon cerveau en me focalisant sur les itérateurs... C'est un peu honteux comme question du coup mais bon, la bêtise ne tue pas, parait-il.

  4. #4
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    La bétise n'a rien à voir avec l'ignorance (ce n'est pas péjoratif hein ). Aucune connaissance n'est innée Et on apprend tous les jours... même ce qui peut paraître évident après coup.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  5. #5
    Membre régulier
    Femme Profil pro
    Développeur Java
    Inscrit en
    Août 2013
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Août 2013
    Messages : 61
    Points : 105
    Points
    105
    Par défaut
    Et comme ce qui ne te tue pas te rend plus fort, tu es gagnant sur toute la ligne

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Creer des variables dans un boucle for
    Par zentro dans le forum Général Python
    Réponses: 2
    Dernier message: 06/04/2008, 07h22
  2. Utiliser des variables dans les noms d'objet
    Par Torkan dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 15/03/2007, 23h54
  3. Afectation des variables dans une boucle
    Par Yoni Lebene dans le forum Delphi
    Réponses: 3
    Dernier message: 05/01/2007, 18h52
  4. [Optimisation?] Déclaration de variable dans les boucles
    Par romaintaz dans le forum Langage
    Réponses: 5
    Dernier message: 11/08/2006, 16h08
  5. [EasyPHP] problème de visibilité des variable dans les includes
    Par d1g-2-d1g dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 4
    Dernier message: 23/10/2005, 01h55

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