Problème de pointeur... (oui, je sais.)

Problème de pointeur... (oui, je sais.) - Java - Programmation

Marsh Posté le 04-03-2004 à 14:06:26    

Voilà, j'ai un soucis avec ce bout de code :
 

Code :
  1. private String whereBuilder(Map map) {
  2. Map lightMap = new HashMap();
  3. lightMap = map;
  4. lightMap.remove("docDescLike" );
  5. lightMap.remove("docRefLike" );
  6. lightMap.remove("docProdDescLike" );
  7. lightMap.remove("docProdRefLike" );
  8. bla bla bla;


 
à l'arrivée, les modifications de lightMap s'appliquent à map, ce qui n'est pas vraiment le but de l'opération...
 
j'ai ratté quoi ?
 
merci du coup de main ! :jap:


---------------
HFR - Mes sujets pour Chrome - Firefox - vérifie les nouveaux posts des topics suivis/favoris
Reply

Marsh Posté le 04-03-2004 à 14:06:26   

Reply

Marsh Posté le 04-03-2004 à 14:11:48    

heuh, ouais, ca parait logique :o

Reply

Marsh Posté le 04-03-2004 à 14:12:05    

ton lightMap = map il fait quoi d'apres toi ? :o

Reply

Marsh Posté le 04-03-2004 à 14:13:30    

on est bien d'accord.
 
donc, comment faire simplement une copie des données de map dans lightMap, sans itérer sur tout les éléments ?
 
y a p't-êt' pas moyen...


---------------
HFR - Mes sujets pour Chrome - Firefox - vérifie les nouveaux posts des topics suivis/favoris
Reply

Marsh Posté le 04-03-2004 à 14:15:28    

Map lightMap = map.clone();
 
?


Message édité par chrisbk le 04-03-2004 à 14:15:34
Reply

Marsh Posté le 04-03-2004 à 14:18:32    

chrisbk a écrit :

Map lightMap = map.clone();
 
?


 :non:  
Map lightMap = (Map) map.clone();
 
 
ou bien tout simplement
Map lightMap = new HashMap(map);


---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 04-03-2004 à 14:20:05    

benou a écrit :


 :non:  
Map lightMap = (Map) map.clone();


 
désolé je fais pu de java depuis que j'ai pu de taf, j'ai oublié ce que c'est les langages ou une instruction sur 2 est un cast :o


Message édité par chrisbk le 04-03-2004 à 14:21:10
Reply

Marsh Posté le 04-03-2004 à 14:21:19    

marchi, j'ai pas vu le clone() !!


---------------
HFR - Mes sujets pour Chrome - Firefox - vérifie les nouveaux posts des topics suivis/favoris
Reply

Marsh Posté le 04-03-2004 à 14:22:14    

brisssou a écrit :

marchi, j'ai pas vu le clone() !!

Et t'as pas non plus vu la Javadoc de Map, hein ? [:zebra33]

Reply

Marsh Posté le 04-03-2004 à 14:23:47    

benou a écrit :


 :non:  
Map lightMap = (Map) map.clone();
 
 
ou bien tout simplement
Map lightMap = new HashMap(map);
 


 
ok, va pour Map lightMap = new HashMap(map);


---------------
HFR - Mes sujets pour Chrome - Firefox - vérifie les nouveaux posts des topics suivis/favoris
Reply

Marsh Posté le 04-03-2004 à 14:23:47   

Reply

Marsh Posté le 04-03-2004 à 14:26:49    

chrisbk a écrit :

Et t'as pas non plus vu la Javadoc de Map, hein ? [:zebra33]


 
bha si :
http://java.sun.com/j2se/1.3/docs/ [...] l/Map.html
mais je vois pas de clone() [:zebra33]


---------------
HFR - Mes sujets pour Chrome - Firefox - vérifie les nouveaux posts des topics suivis/favoris
Reply

Marsh Posté le 04-03-2004 à 14:27:33    

clone ca vient de Object [:zebra33]
 
puis je suggerer Java pour les nuls ? [:zebra33]

Reply

Marsh Posté le 04-03-2004 à 14:35:09    

chrisbk a écrit :

clone ca vient de Object [:zebra33]
 
puis je suggerer Java pour les nuls ? [:zebra33]


 
tout à fait.
 
néanmoins, mon compilateur préféré refuse de prendre map.clone() :
The method clone() for type Object is not visible.
même après un étrange import java.lang.Object.
 
quoi k'il en soit, new HashMap(map) fonctionne très bien,
alors merci de votre aide à tous les deux.


Message édité par brisssou le 04-03-2004 à 14:37:17

---------------
HFR - Mes sujets pour Chrome - Firefox - vérifie les nouveaux posts des topics suivis/favoris
Reply

Marsh Posté le 04-03-2004 à 14:45:30    

brisssou a écrit :


néanmoins, mon compilateur préféré refuse de prendre map.clone() :
The method clone() for type Object is not visible.
même après un étrange import java.lang.Object.


en effet : il n'y a pas de lien entre les interfaces et la classe Object ... j'avais jamais pensé à ca ... c'est un peu con en fait :/
 
j'ai rien dit :o


Message édité par benou le 04-03-2004 à 15:04:45

---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 04-03-2004 à 14:58:19    

C'est normal puisque la méthode clone() de Object est protégée. Pour utiliser cette méthode, la sous-classe doit obligatoirement implémenter l'interface Cloneable, ce qui "promeut" (je sais pas si ça se dit) la méthode clone() de protégée en publique et devient donc utilisable.

Reply

Marsh Posté le 04-03-2004 à 15:04:14    

machinbidule1974 a écrit :

C'est normal puisque la méthode clone() de Object est protégée. Pour utiliser cette méthode, la sous-classe doit obligatoirement implémenter l'interface Cloneable, ce qui "promeut" (je sais pas si ça se dit) la méthode clone() de protégée en publique et devient donc utilisable.


 
très bien pour promeut [:aloy]
 
et merci pour ces précisions


---------------
HFR - Mes sujets pour Chrome - Firefox - vérifie les nouveaux posts des topics suivis/favoris
Reply

Marsh Posté le 04-03-2004 à 15:04:16    

machinbidule1974 a écrit :

C'est normal puisque la méthode clone() de Object est protégée. Pour utiliser cette méthode, la sous-classe doit obligatoirement implémenter l'interface Cloneable, ce qui "promeut" (je sais pas si ça se dit) la méthode clone() de protégée en publique et devient donc utilisable.


pas tout à fait ...
regarde la javadoc : Cloneable est une interface vide.
clone est une particularité du langage java et est traité "à part"
 
mais en effet, tu as raison, le problème vient bien du fait que clone soit protected.


---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 04-03-2004 à 15:05:03    

En fait, pour pouvoir appeler la méthode clone(), la classe doit implémenter l'interface Cloneable. Et malheureusement pour brissou, aucune des interfaces List, Map, etc. n'étend Cloneable. Seules les classes non abstraites, comme ArrayList, HashMap, ..., l'implémente.
 
Donc même si la solution clone() semble plus élégante, elle est inutilisable ici, et il faut utiliser la solution new HashMap(map).

Reply

Marsh Posté le 04-03-2004 à 15:05:39    

Entre nous, c'est une sacrée connerie clone :/


---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 04-03-2004 à 15:06:49    

Explique, parce qu'a priori je ne suis d'accord...

Reply

Marsh Posté le 04-03-2004 à 15:09:29    

benou a écrit :


pas tout à fait ...
regarde la javadoc : Cloneable est une interface vide.
clone est une particularité du langage java et est traité "à part"

 
mais en effet, tu as raison, le problème vient bien du fait que clone soit protected.  


 
Une interface vide, c'est pas une interface de marquage ou tagging interface (comme Serializable) ? Je ne pense pas qu'il y ait un traitement particulier pour ce type d'interface, je pense plutôt que le code de la méthode clone() de Object doit avoir une instruction du type:
 

Code :
  1. if (this instanceof Cloneable) {
  2.    ...
  3. } else {
  4.    throw new CloneNotSupportedException();
  5. }


 
Enfin, je peux me tromper. BifaceMcLeOD va sûrement nous donner la réponse ultime  :D

Reply

Marsh Posté le 04-03-2004 à 15:29:09    

Ultime, certainement pas  :pfff:  ;)  , j'essaie juste d'apporter des éléments de réponse. Et en les confrontant à d'autres forumeurs, je les complète et j'apprends...
 
Bon, si on regarde bien, clone() de la classe Object a la signature suivante :

Code :
  1. protected native Object clone() throws CloneNotSupportedException;


Ce qui signifie plusieurs choses :

  • La méthode est native, donc on peut toujours se gratter pour savoir réellement ce qu'elle fait. D'un autre côté, d'après le javadoc de la classe, elle lève systématiquement CloneNotSupportedException.
  • La méthode est protégée, ce qui signifie que la méthode ne peut pas être appeler sur une instance d'Object. Ce qui explique le message d'erreur qu'obtient brissou en appelant clone() sur un objet de type Map : "La méthode clone() pour le type Object n'est pas visible".
  • Comme vous l'avez noté (et chose que j'ignorais), l'interface Cloneable est vide... Ce qui, en toute logique, signifie que l'implémenter n'engage à rien. Ce que confirme d'ailleurs le javadoc de cette interface : "Notez que cette interface ne contient pas de méthode clone. Par conséquent, il n'est pas possible de cloner un objet du simple fait qu'il implémente cette interface. Même si la méthode clone est invoquée par réflexion, il n'y a aucune garantie que l'invocation réussisse.". Rien n'empêche par ailleurs de redéfinir la méthode clone (en la rendant publique) sans implémenter l'interface Cloneable. Je n'ai pas essayé, mais ça doit pouvoir marcher. Du coup, si c'est la cas, à part pour informer les autres programmeurs, à quoi sert cette interface ?


PS: Benou, à la réflexion, je commence à me dire que la gestion du clonage en Java est une sinistre connerie...  :ange:  :jap:

Reply

Marsh Posté le 04-03-2004 à 15:46:11    

pour quelques précisions :  
http://penserenjava.free.fr/pens/i [...] n_17&1.htm

Citation :

Object.clone() calcule la taille de l'objet, réserve assez de mémoire pour en créer un nouveau, et copie tous les bits de l'ancien dans le nouveau. On appelle cela une copie bit à bit, et c'est typiquement ce qu'on attend d'une méthode clone(). Mais avant que Object.clone() ne réalise ces opérations, elle vérifie d'abord que la classe est Cloneable - c'est à dire, si elle implémente l'interface Cloneable. Si ce n'est pas le cas, Object.clone() génère une exception CloneNotSupportedException pour indiquer qu'on ne peut la cloner. C'est pourquoi il faut entourer l'appel à super.clone() dans un bloc try-catch, pour intercepter une exception qui théoriquement ne devrait jamais arriver (parce qu'on a implémenté l'interface Cloneable).


Message édité par benou le 04-03-2004 à 15:46:23

---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 04-03-2004 à 16:05:35    

Tu vois, machinbidule1974, la réponse ultime vient de benou ! :D

Reply

Marsh Posté le 04-03-2004 à 16:09:29    

Citation :

Object.clone() calcule la taille de l'objet, réserve assez de mémoire pour en créer un nouveau, et copie tous les bits de l'ancien dans le nouveau. On appelle cela une copie bit à bit, et c'est typiquement ce qu'on attend d'une méthode clone().


 
ben bof, ptet qu'on voudrait aussi parfois qu'elle clone les objets contenus par l'objet cloné , non ?

Reply

Marsh Posté le 04-03-2004 à 16:25:08    

chrisbk a écrit :

Citation :

Object.clone() calcule la taille de l'objet, réserve assez de mémoire pour en créer un nouveau, et copie tous les bits de l'ancien dans le nouveau. On appelle cela une copie bit à bit, et c'est typiquement ce qu'on attend d'une méthode clone().


 
ben bof, ptet qu'on voudrait aussi parfois qu'elle clone les objets contenus par l'objet cloné , non ?

encore faut elle qu'elle sache comment les cloner


---------------
http://runnerstats.net
Reply

Marsh Posté le 04-03-2004 à 17:27:39    

chrisbk a écrit :


ben bof, ptet qu'on voudrait aussi parfois qu'elle clone les objets contenus par l'objet cloné , non ?


si tu suis le liens que j'ai donné, il explique juste derrière comment faire ...
 
(en résumé : appeler les méthodes clones des attributs ... ce qui doit d'ailleur poser problème dans le cas de références circulaires [:gratgrat])


---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 04-03-2004 à 22:23:39    

benou a écrit :


si tu suis le liens que j'ai donné, il explique juste derrière comment faire ...
 
(en résumé : appeler les méthodes clones des attributs ... ce qui doit d'ailleur poser problème dans le cas de références circulaires [:gratgrat])


 
effectivemetn dans ce cas, t'as intéret a faire super gaffe a ce que tu fais :D
 
lorill s'en souviendra peut etre ;)

Reply

Marsh Posté le 05-03-2004 à 00:09:13    

benou a écrit :


si tu suis le liens que j'ai donné, il explique juste derrière comment faire ...
 
(en résumé : appeler les méthodes clones des attributs ... ce qui doit d'ailleur poser problème dans le cas de références circulaires [:gratgrat])

Le problème a déjà été soulevé par kadreg dans la discussion sur le langage de lorill (il y a un paquet de temps).
 
Il ne faut pas confondre composition d'objets et aggrégation d'objets, qui se traduisent tous deux "techniquement" par des références. C'est pour ça qu'on ne peut pas copier bourrinement en profondeur un objet, mais qu'on ne doit copier en profondeur que certains champs. Et c'est pour ça que les langages nous demandent de nous démerder à la main si on veut du clone().


---------------
trainoo.com, c'est fini
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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