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 :
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.
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; }
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 :
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.
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); }
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 :Cordialement.
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; }
Partager