Problème d'effet de bord [Java] - Java - Programmation
Marsh Posté le 18-01-2003 à 16:07:49
tu envoies à la méthode un clone de l'objet où tu fais une copie locale de l'objet que tu passes en paramètre
Marsh Posté le 18-01-2003 à 16:44:09
j'ai essayé ta méthode de cette façon:
Code :
|
mais cela fait exactement la même chose, tabObjet1[] est toujours modifié après l'appel.
J'ai cherché de l'aide sur clone() j'ai trouvé ça dans la doc:
Note that all arrays are considered to implement the interface Cloneable. Otherwise, this method creates a new instance of the class of this object and initializes all its fields with exactly the contents of the corresponding fields of this object, as if by assignment; the contents of the fields are not themselves cloned. Thus, this method performs a "shallow copy" of this object, not a "deep copy" operation.
d'après ce que je comprends clone() ne permet pas de cloner les objets attributs de MonObjet1 s'ils sont complexes (c'est mon cas).
Dans ce cas comment faire ?
Marsh Posté le 18-01-2003 à 16:49:39
faut implémenter la méthode clone de MonObjet1 pour cloner correctement les attributs
Marsh Posté le 18-01-2003 à 17:52:12
le problème c'est je fais le clone sur le tableau d'objets tabObjet1[] et non sur une instance de MonObjet1.
la méthode clone() que j'implémente dans la classe MonObjet1 n'est donc pas appelée.
Marsh Posté le 18-01-2003 à 17:54:29
Redant a écrit : le problème c'est je fais le clone sur le tableau d'objets tabObjet1[] et non sur une instance de MonObjet1. |
normalement si... je suppose que tabObjet.clone() appelle clone sur chacun de ses élements. Mais je suis pas sur de moi sur ce coup la. Essaye deja en mettant un simple println dedans, tu seras vite fixé !
Marsh Posté le 18-01-2003 à 18:01:34
lorill a écrit : |
Tu suppose mal, c'est justement le contraire qui se passe comme le montre l'extrait de doc cité par Redant
Marsh Posté le 18-01-2003 à 18:12:40
kadreg a écrit : |
+1
-> ecrire une methode tabClone qui crée un nouveau tableau contenant les clones des elements de tabObjet1
Marsh Posté le 18-01-2003 à 18:15:23
kadreg a écrit : |
oups
c'est quoi l'intéret d'avoir choisi cette solution ?
Marsh Posté le 18-01-2003 à 18:19:44
lorill a écrit : |
Les array[] en java m'ont toujours semblé un peu bizarre. J'ai l'impression qu'ils font plus ou moins partie des types primitif non objet (int passe par valeur par exemple), sauf qu'ils ont quand même des méthodes.
Un concept assez bizarre, du même ordre d'ailleurs que les [] en C++.
Marsh Posté le 20-01-2003 à 11:48:34
Ce sont effectivement des objets bâtards. Mais leur principal avantage reste la rapidité d'accés comparé aux solutions équivalentes (comparez le temps d'exécution pour parcourir un tableau de 500 éléments par indice, ou une liste de 500 éléments par indice ou pire par itérateur... C'est impressionant)
Marsh Posté le 21-01-2003 à 06:32:59
kadreg a écrit : |
et ils permettent un peut de généricité typée "safe" en bidouillant avec (je suppose) le package lang.reflect :
http://java.sun.com/j2se/1.4.1/doc [...] ang.Object[])
vive la magouille ! Mais bon, je vais pas me plaindre, pour une fois que ça ne se finit pas à coup de "downcast" dans la hiérarchie.
Marsh Posté le 18-01-2003 à 15:38:11
ça doit être très con mais je bloque, voici le bout de code qui me pose problème:
Le problème est que je ne veux pas que tabObjet1 soit modifié par la méthode appelée sur obj2.
En C il suffirait de faire un passage par valeur, mais en java vu que tout objet est une référence je vois pas comment faire.
merci d'avance,