Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1597 connectés 

  FORUM HardWare.fr
  Programmation
  Java

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°662826
brisssou
8-/
Posté le 04-03-2004 à 14:06:26  profilanswer
 

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
mood
Publicité
Posté le 04-03-2004 à 14:06:26  profilanswer
 

n°662841
chrisbk
-
Posté le 04-03-2004 à 14:11:48  profilanswer
 

heuh, ouais, ca parait logique :o

n°662842
chrisbk
-
Posté le 04-03-2004 à 14:12:05  profilanswer
 

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

n°662845
brisssou
8-/
Posté le 04-03-2004 à 14:13:30  profilanswer
 

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
n°662848
chrisbk
-
Posté le 04-03-2004 à 14:15:28  profilanswer
 

Map lightMap = map.clone();
 
?


Message édité par chrisbk le 04-03-2004 à 14:15:34
n°662855
benou
Posté le 04-03-2004 à 14:18:32  profilanswer
 

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
n°662856
chrisbk
-
Posté le 04-03-2004 à 14:20:05  profilanswer
 

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
n°662860
brisssou
8-/
Posté le 04-03-2004 à 14:21:19  profilanswer
 

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


---------------
HFR - Mes sujets pour Chrome - Firefox - vérifie les nouveaux posts des topics suivis/favoris
n°662863
chrisbk
-
Posté le 04-03-2004 à 14:22:14  profilanswer
 

brisssou a écrit :

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

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

n°662868
brisssou
8-/
Posté le 04-03-2004 à 14:23:47  profilanswer
 

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
mood
Publicité
Posté le 04-03-2004 à 14:23:47  profilanswer
 

n°662872
brisssou
8-/
Posté le 04-03-2004 à 14:26:49  profilanswer
 

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
n°662877
chrisbk
-
Posté le 04-03-2004 à 14:27:33  profilanswer
 

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

n°662894
brisssou
8-/
Posté le 04-03-2004 à 14:35:09  profilanswer
 

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
n°662914
benou
Posté le 04-03-2004 à 14:45:30  profilanswer
 

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
n°662945
machinbidu​le1974
Do you feel lucky, punk ?
Posté le 04-03-2004 à 14:58:19  profilanswer
 

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.

n°662952
brisssou
8-/
Posté le 04-03-2004 à 15:04:14  profilanswer
 

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
n°662953
benou
Posté le 04-03-2004 à 15:04:16  profilanswer
 

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
n°662955
BifaceMcLe​OD
The HighGlandeur
Posté le 04-03-2004 à 15:05:03  profilanswer
 

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

n°662956
benou
Posté le 04-03-2004 à 15:05:39  profilanswer
 

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


---------------
ma vie, mon oeuvre - HomePlayer
n°662959
BifaceMcLe​OD
The HighGlandeur
Posté le 04-03-2004 à 15:06:49  profilanswer
 

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

n°662960
machinbidu​le1974
Do you feel lucky, punk ?
Posté le 04-03-2004 à 15:09:29  profilanswer
 

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

n°662980
BifaceMcLe​OD
The HighGlandeur
Posté le 04-03-2004 à 15:29:09  profilanswer
 

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:

n°663007
benou
Posté le 04-03-2004 à 15:46:11  profilanswer
 

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
n°663033
BifaceMcLe​OD
The HighGlandeur
Posté le 04-03-2004 à 16:05:35  profilanswer
 

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

n°663036
chrisbk
-
Posté le 04-03-2004 à 16:09:29  profilanswer
 

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 ?

n°663050
noldor
Rockn'roll
Posté le 04-03-2004 à 16:25:08  profilanswer
 

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
n°663159
benou
Posté le 04-03-2004 à 17:27:39  profilanswer
 

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
n°663620
HappyHarry
Posté le 04-03-2004 à 22:23:39  profilanswer
 

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 ;)

n°663772
nraynaud
lol
Posté le 05-03-2004 à 00:09:13  profilanswer
 

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
mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Java

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

 

Sujets relatifs
LIENS: problème avec style="text-decoration:no"Ecriture dans un fichier XLS : problème de format
[ASP] Probleme avec les date , erreur avec le datatype de ma bd !problème de rafraichissement forum php
probleme d'adaptation sous windows XP de visual CProblème d'accent entre Flash et ASP.NET
Problème avec un site php + base de donnée my sql :([resolu] Probleme de PREG_REPLACE
Librairie IMAP, problème avec imap_setflag_fullProbleme simple , mais je trouve pas !
Plus de sujets relatifs à : Problème de pointeur... (oui, je sais.)


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR