Clonage d'objets RESOLU

Clonage d'objets RESOLU - Java - Programmation

Marsh Posté le 30-08-2002 à 00:33:29    

Heu, je suis pas sur d'avoir compris ce que veulent dire les nuances suivantes :
 
shallow clone
deep clone
 
Moi, je veux cloner un objet qui contient une référence à un autre objet. Je veux que tous mes clones aient la même référence sur ce point précis, mais que les autres champs soient des nouvelles instances. Alors comment je la fais ma méthode clone ?


Message édité par Cherrytree le 30-08-2002 à 14:15:59

---------------
Le site de ma maman
Reply

Marsh Posté le 30-08-2002 à 00:33:29   

Reply

Marsh Posté le 30-08-2002 à 00:54:21    

ben clonage de surface/profondeur non ? ('fin suivant les traductions)
 
c koi le probleme ? tu me le détailles ?


Message édité par HappyHarry le 30-08-2002 à 00:54:30
Reply

Marsh Posté le 30-08-2002 à 00:59:24    

imagine un objet A qui contient une reference vers un objet B
 
shallow clone : quand A est cloné, la reference vers B reste la meme
 
deep clone : quand A est cloné, la référence est vers un nouvel objet B (B est cloné également)

Reply

Marsh Posté le 30-08-2002 à 01:00:00    

et toi tu veux faire un mélange des deux ...

Reply

Marsh Posté le 30-08-2002 à 01:03:23    

Mon problème est le suivant :
 

Code :
  1. public class Data {
  2.     private Task task;
  3.     private int value;
  4.     public Data(Task task, int value) {
  5.         this.task = task;
  6.         this.value = value;
  7.     }
  8. }


 
Je dispose d'un tableau de Data :

Data[] datas


 
Je veux cloner "datas", tout en laissant l'objet task en référence pour tous les clones. Comment j'écris ma méthode clone, alors ?


---------------
Le site de ma maman
Reply

Marsh Posté le 30-08-2002 à 01:08:46    

ben
 

Code :
  1. class Data
  2. {
  3. blablabla clone()
  4. {
  5. return new Data(this.task,this.value);
  6. }


 
la tu as cloné un objet Data comme tu le voulais, la référence est intacte ...
 
je vois pas ou est le soucis  :??:


Message édité par HappyHarry le 30-08-2002 à 01:09:03
Reply

Marsh Posté le 30-08-2002 à 01:09:55    

Ben, j'ai jamais cloné, j'ai peur de copier des trucs que je veux pas copier, ou de faire des références où il ne faut pas.


---------------
Le site de ma maman
Reply

Marsh Posté le 30-08-2002 à 01:11:58    

ben c simple
si tu as un attribut qui n'est pas un type de base (objet donc)
si tu veux garder la référence : tu la passes en arguement du constructeur de ton objet ici Date(this.task,this.value)
sinon tu passes un nouvel objet du type voulu : ca donnerait new Date(new Task(aveclesparamsquivontbien),this.value)

Reply

Marsh Posté le 30-08-2002 à 01:12:14    

Et là, si je tripote value, dans un de mes clones ça va affecter les autres, non ? Quoique non, puisque c'est un type primitif... Heu, en fait j'ai besoin de voir différent cas, pour bien voir la portée de ce mécanisme. Curieusement, j'en avais jamais eu besoin avant.


---------------
Le site de ma maman
Reply

Marsh Posté le 30-08-2002 à 01:13:27    

Cherrytree a écrit a écrit :

Et là, si je tripote value, dans un de mes clones ça va affecter les autres, non ? Quoique non, puisque c'est un type primitif... Heu, en fait j'ai besoin de voir différent cas, pour bien voir la portée de ce mécanisme. Curieusement, j'en avais jamais eu besoin avant.




 
ben honnetement j'm'en suis jamais trop servi non plus ... mauvais souvenir de TP :D
ca va rien affecter puisque tu crées a chaque fois une nouvelle instance de Data, et pis c un type de base, donc pas une référence

Reply

Marsh Posté le 30-08-2002 à 01:13:27   

Reply

Marsh Posté le 30-08-2002 à 01:14:45    

Et la méthode clone() de Object, elle fait quoi en fait, si je fais un super.clone(), quel va être le résultat ?


---------------
Le site de ma maman
Reply

Marsh Posté le 30-08-2002 à 01:16:00    

Cherrytree a écrit a écrit :

Et la méthode clone() de Object, elle fait quoi en fait, si je fais un super.clone(), quel va être le résultat ?




 
clonage superficiel

Reply

Marsh Posté le 30-08-2002 à 01:18:42    

HappyHarry a écrit a écrit :

 
 
clonage superficiel



l'équivalent de celle que tu as décrite, dans mon cas, donc.


---------------
Le site de ma maman
Reply

Marsh Posté le 30-08-2002 à 01:22:59    

Cherrytree a écrit a écrit :

l'équivalent de celle que tu as décrite, dans mon cas, donc.




 
yep, il va conserver la référence a ton objet Task

Reply

Marsh Posté le 30-08-2002 à 01:23:49    

OK !


---------------
Le site de ma maman
Reply

Marsh Posté le 30-08-2002 à 01:29:03    

cette ligne de mon code foire :
 

Code :
  1. public class Cloner(Data[] datas) {
  2.     private Data[] datas;
  3.     public Cloner(Data[] datas) {
  4.         this.datas = (Data[])datas.clone();
  5.     }
  6. }


 
Je sentais bien que c'était faux, mais je connais pas la bonne syntaxe, en fait. :sweat:


---------------
Le site de ma maman
Reply

Marsh Posté le 30-08-2002 à 01:29:26    

J'aime les joce's bug !


---------------
Le site de ma maman
Reply

Marsh Posté le 30-08-2002 à 01:41:54    

Cherrytree a écrit a écrit :

cette ligne de mon code foire :
 

Code :
  1. public class Cloner(Data[] datas) {
  2.     private Data[] datas;
  3.     public Cloner(Data[] datas) {
  4.         this.datas = (Data[])datas.clone();
  5.     }
  6. }


 
Je sentais bien que c'était faux, mais je connais pas la bonne syntaxe, en fait. :sweat:  




 
euh ... tu veux pas betement créer un tableau de meme taille et cloner les éléments du tableau ?  :ange:

Reply

Marsh Posté le 30-08-2002 à 01:44:00    

Autant pour moi, en fait ça marche, c'était une erreur d'héritage sur le constructeur. :ange: Par contre, ça clone que dalle, on dirait. Bon allons y pour le débug. :)


---------------
Le site de ma maman
Reply

Marsh Posté le 30-08-2002 à 02:13:41    

Bon, le problème est le suivant :
 
ça marche pour un objet unique, mais dès que je veux cloner un tableau, c'est comme si je passais une référence : la question est donc comment cloner un tableau d'objets.


---------------
Le site de ma maman
Reply

Marsh Posté le 30-08-2002 à 02:21:48    

Si je fais le clonage élément par élément, là ça marche. y a moyen de faire moins lourd ?


---------------
Le site de ma maman
Reply

Marsh Posté le 30-08-2002 à 09:00:46    

:bounce:


---------------
Le site de ma maman
Reply

Marsh Posté le 30-08-2002 à 09:05:19    

Cherrytree a écrit a écrit :

Si je fais le clonage élément par élément, là ça marche. y a moyen de faire moins lourd ?




 
non pas que je sache en tout cas.


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 30-08-2002 à 09:15:04    

Cherrytree a écrit a écrit :

Si je fais le clonage élément par élément, là ça marche. y a moyen de faire moins lourd ?




System.arrayCopy est ton ami !

Reply

Marsh Posté le 30-08-2002 à 09:19:44    

benou a écrit a écrit :

 
System.arrayCopy est ton ami !




 
 :jap: j'avais pas vu qu'il parlait d'éléments d'un tableau ... mal réveillé moa


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 30-08-2002 à 09:20:49    

benou a écrit a écrit :

 
System.arrayCopy est ton ami !




grilled

Reply

Marsh Posté le 30-08-2002 à 09:27:57    

bobuse a écrit a écrit :

 
grilled




 :??:

Reply

Marsh Posté le 30-08-2002 à 09:34:03    

il a voulu l'écrire puis il a vu ton post surement ...


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 30-08-2002 à 09:45:37    

DarkLord a écrit a écrit :

il a voulu l'écrire puis il a vu ton post surement ...




ouaip!
trop rapide ce benou ! :benetton:  :jap:

Reply

Marsh Posté le 30-08-2002 à 09:51:59    

Bon, ben je vais voir ça. System.arrayCopy fait appel à la méthode clone des éléments du tableaux, je suppose, non ?


---------------
Le site de ma maman
Reply

Marsh Posté le 30-08-2002 à 10:19:40    

Cherrytree a écrit a écrit :

Bon, ben je vais voir ça. System.arrayCopy fait appel à la méthode clone des éléments du tableaux, je suppose, non ?




non, ca copie un tableau de façon binaire (et de façon optimisée).
bref, tu fais ca quoi  :

Code :
  1. Data[] nDatas = new Data[datas.length];
  2. System.arrayCopy(datas, 0, nDatas, 0, datas.length);

Reply

Marsh Posté le 30-08-2002 à 10:34:30    

Et donc ce qui était référence restera référence, c'est ça ?


---------------
Le site de ma maman
Reply

Marsh Posté le 30-08-2002 à 10:40:59    

bin non c'est un clone ... c'est copié quoi


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 30-08-2002 à 11:21:27    

Bin alors comment faire pour obtenir la chose suivante :
 
Une liste d'objet doit être passée en référence à des Solvers (dont le nombre varie, certains sont détruits, d'autres créés...), sachant qu'à chaque élément de la liste doit correspondre une valeur, propre à chaque Solver.
 
Je reprends :
Un solver, c'est un tableau, dont chaque élément est constitué d'un Objet appartenant à la liste de départ, et d'un entier, propre à ce Solver.


---------------
Le site de ma maman
Reply

Marsh Posté le 30-08-2002 à 11:26:51    

et ... ?


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 30-08-2002 à 11:39:02    

Le problème est le suivant :
 
http://yozakura.free.Fr/hfr/pb.gif


---------------
Le site de ma maman
Reply

Marsh Posté le 30-08-2002 à 11:41:08    

DarkLord a écrit a écrit :

et ... ?



Je veux créer des instances de Solver, je veux des clones qui conaissent les éléments de TaskList (la liste de départ) et qui associent via Data un entier, non cloné. Comment feriez vous ?


---------------
Le site de ma maman
Reply

Marsh Posté le 30-08-2002 à 11:56:09    

Dans chaque Solver, il y a autant d'objet Data dans le tableau Data[] que d'objet Task dans TaskList. Le nombre d'objets Solver est indépendant de tout ça, mais il y en aura beaucoup.


---------------
Le site de ma maman
Reply

Marsh Posté le 30-08-2002 à 12:25:09    

je suis désolé je comprends rien.


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 30-08-2002 à 12:46:10    

cherrytree tu me pretes ton penpad stp?
(c bien ça que tu voulais montrer nan? :o)
 
([:blueflag] btw)


---------------
#19b | Mardi 18 Février 2003 - nous fêtons les Bernadette | contre le fleur icq!
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed