Problème copie Arraylist incompréhensible

[Résolu]
Signaler
Messages postés
147
Date d'inscription
samedi 7 juin 2003
Statut
Membre
Dernière intervention
8 décembre 2007
-
Messages postés
147
Date d'inscription
samedi 7 juin 2003
Statut
Membre
Dernière intervention
8 décembre 2007
-
Salut tt le monde!

Alors voilà j'ai une fenetre modal qui me retourne une Arraylist
J'ai deux possibilité, soit je valide, soit j'annule
Si je valide la liste est modifiée, si j'annule je veux renvoyer la liste sans les modifications...

Je prépare ma fenetre comme ça...
maFormmaFenetre = new maForm(maListedeBase);
maFenetre.ShowDialog();
returnmaFenetre.maListe;

Dans l'initialisation de la fenetre je recopie maListedeBase dans this.maListe et dans this.maListeSAV :
this.maListe = maListedeBase;
this.maListeSAV = maListedeBase;

(...traitement...)

Si l'utilisateur click sur annuler dans l'evenement du bouton je fait :
this.maListe = this.maListeSAV;

Donc déjà ici je me suis apperçu que ça ne marchait pas car ma liste était quand même modifiée alors j'ai changé d'écriture et j'ai écrit comme ça dans l'evenement du bouton :
this.maListe = new ArrayList(this.maListeSAV);

>> De la même façon j'ai aussi modifié le début :
this.maListe = new ArrayList(maListedeBase);
this.maListeSAV = new ArrayList(maListedeBase);

Ici plus aucun problème il me recopiait bien les éléments d'origine mais en fesant des tests j'ai eu une grosse surprise!! !

Dans mes listes j'ai des Objets que je peut ajouter, supprimer et aussi modifier leur propriétés et quand je modifie une propriété et que j'annule la propriété à quand même été modifiée malgrès le new ArrayList(this.maListeSAV); !!!

Quelqu'un a t il une explication rationnelle ?

MERCI BEAUCOUP à celui qui m'aidera à comprendre!!

PS: Je précise que je travail directement sur la liste maListe et que à aucun moment je ne touche à maListeSAV

5 réponses

Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
41
C'est la différence entre une copie partielle et une copie complète, les objets de types valeurs sont copiés ( bit par bit ) mais les objets de type références une copie de leur référence est faite mais elles pointent sur le même objet en mémoire. La classe ArrayList a une fonction Clone mais tu auras le même problème, faut certainement créer ta propre fonction de copie.
Messages postés
427
Date d'inscription
mercredi 1 octobre 2003
Statut
Membre
Dernière intervention
29 janvier 2008
1
this.maListe = maListedeBase;
this.maListeSAV = maListedeBase;

maListeSAV => tu a fait une nouvelle isntance de cette liste
si tu n'as pas fait de nouvelle instance => c'est juste une variable pointeur qui ce rapport a la plage memoire ou est stockée maListedeBase

> si pas de nouvelles instance maListe maListeSAV = maListedeBase ...
Messages postés
147
Date d'inscription
samedi 7 juin 2003
Statut
Membre
Dernière intervention
8 décembre 2007

ok c'est se que je me suis dis
Mais après j'ai fait :
this.maListe = new ArrayList(maListedeBase);
this.maListeSAV = new ArrayList(maListedeBase);

Comment celà se fait il que ça marche lorsque je me contente de supprimer ou ajouter des éléments mais que lorsque je modifie une propriété de l'élément celà ne marche plus ?
maListeSav != de maListe non ?
ou alors maListeSav !maListe mais maListeSAV.Items maListe.Items ? l'entité arrayliste étant différente mais pas les entités objets la comportant ?
Messages postés
147
Date d'inscription
samedi 7 juin 2003
Statut
Membre
Dernière intervention
8 décembre 2007

ben non c pas des items pourtant...
Messages postés
147
Date d'inscription
samedi 7 juin 2003
Statut
Membre
Dernière intervention
8 décembre 2007

Il faut que je fasse une copie de chaque objet de mon ArrayList plutot que de l'ArrayList elle même.. et si il y a annulation je fait un clear et je rajoute la savegarde de chacun de mes objets sauvé!
Ben ça c pas terrible...

Au boulot!! lol

Merci bien