Problème de pointeur... (oui, je sais.) - Java - Programmation
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...
Marsh Posté le 04-03-2004 à 14:15:28
Map lightMap = map.clone();
?
Marsh Posté le 04-03-2004 à 14:18:32
chrisbk a écrit : Map lightMap = map.clone(); |
Map lightMap = (Map) map.clone();
ou bien tout simplement
Map lightMap = new HashMap(map);
Marsh Posté le 04-03-2004 à 14:20:05
benou a écrit : |
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
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 ?
Marsh Posté le 04-03-2004 à 14:23:47
benou a écrit : |
ok, va pour Map lightMap = new HashMap(map);
Marsh Posté le 04-03-2004 à 14:26:49
chrisbk a écrit : Et t'as pas non plus vu la Javadoc de Map, hein ? |
bha si :
http://java.sun.com/j2se/1.3/docs/ [...] l/Map.html
mais je vois pas de clone()
Marsh Posté le 04-03-2004 à 14:27:33
clone ca vient de Object
puis je suggerer Java pour les nuls ?
Marsh Posté le 04-03-2004 à 14:35:09
chrisbk a écrit : clone ca vient de Object |
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.
Marsh Posté le 04-03-2004 à 14:45:30
brisssou a écrit : |
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
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.
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
et merci pour ces précisions
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.
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).
Marsh Posté le 04-03-2004 à 15:05:39
ReplyMarsh Posté le 04-03-2004 à 15:09:29
benou a écrit : |
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 :
|
Enfin, je peux me tromper. BifaceMcLeOD va sûrement nous donner la réponse ultime
Marsh Posté le 04-03-2004 à 15:29:09
Ultime, certainement pas , 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 :
|
Ce qui signifie plusieurs choses :
PS: Benou, à la réflexion, je commence à me dire que la gestion du clonage en Java est une sinistre connerie...
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). |
Marsh Posté le 04-03-2004 à 16:05:35
Tu vois, machinbidule1974, la réponse ultime vient de benou !
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 ?
Marsh Posté le 04-03-2004 à 16:25:08
chrisbk a écrit :
|
encore faut elle qu'elle sache comment les cloner
Marsh Posté le 04-03-2004 à 17:27:39
chrisbk 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 )
Marsh Posté le 04-03-2004 à 22:23:39
benou a écrit : |
effectivemetn dans ce cas, t'as intéret a faire super gaffe a ce que tu fais
lorill s'en souviendra peut etre
Marsh Posté le 05-03-2004 à 00:09:13
benou a écrit : |
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().
Marsh Posté le 04-03-2004 à 14:06:26
Voilà, j'ai un soucis avec ce bout de code :
à 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 !
---------------
HFR - Mes sujets pour Chrome - Firefox - vérifie les nouveaux posts des topics suivis/favoris