[Java]Problème d'effet de bord

Problème d'effet de bord [Java] - Java - Programmation

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:
 

Code :
  1. MonObjet1 tabObjet1[];
  2. MonObjet2 obj2;
  3. //appel des constructeurs pour tabObjet1[] et obj2
  4. obj2.methode(tabObjet1); //cette méthode modifie le tabObjet1
  5. //après l'appel de la méthode sur obj2 tabObjet1[] a changé


 
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,
 

Reply

Marsh Posté le 18-01-2003 à 15:38:11   

Reply

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


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

Marsh Posté le 18-01-2003 à 16:44:09    


j'ai essayé ta méthode de cette façon:
 

Code :
  1. obj2.methode((MonObjet1[])tabObjet1.clone());


 
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 ?

Reply

Marsh Posté le 18-01-2003 à 16:49:39    

faut implémenter la méthode clone de MonObjet1 pour cloner correctement les attributs  [:sinclaire]

Reply

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.

Reply

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.
 
la méthode clone() que j'implémente dans la classe MonObjet1 n'est donc pas appelée.


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é !

Reply

Marsh Posté le 18-01-2003 à 18:01:34    

lorill a écrit :


Je suppose que tabObjet.clone() appelle clone sur chacun de ses élements.  


 
Tu suppose mal, c'est justement le contraire qui se passe comme le montre l'extrait de doc cité par Redant


---------------
brisez les rêves des gens, il en restera toujours quelque chose...  -- laissez moi troller sur discu !
Reply

Marsh Posté le 18-01-2003 à 18:12:40    

kadreg a écrit :


 
Tu suppose mal, c'est justement le contraire qui se passe comme le montre l'extrait de doc cité par Redant


 
+1
 
-> ecrire une methode tabClone qui crée un nouveau tableau contenant les clones des elements de tabObjet1

Reply

Marsh Posté le 18-01-2003 à 18:15:23    

kadreg a écrit :


Tu suppose mal, c'est justement le contraire qui se passe comme le montre l'extrait de doc cité par Redant


oups :o
 
c'est quoi l'intéret d'avoir choisi cette solution ?

Reply

Marsh Posté le 18-01-2003 à 18:19:44    

lorill a écrit :


c'est quoi l'intéret d'avoir choisi cette solution ?


 
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++.


---------------
brisez les rêves des gens, il en restera toujours quelque chose...  -- laissez moi troller sur discu !
Reply

Marsh Posté le 18-01-2003 à 18:19:44   

Reply

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)

Reply

Marsh Posté le 21-01-2003 à 06:32:59    

kadreg 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++.


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.


Message édité par nraynaud le 21-01-2003 à 06:35:53
Reply

Sujets relatifs:

Leave a Replay

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