Si je comprends bien, il existe plusieurs façons (peut-être d'autres également) de créer une copie superficielle d'un Map
en Java:
Map<String, Object> data = new HashMap<String, Object>();
Map<String, Object> shallowCopy;
// first way
shallowCopy = new HashMap<String, Object>(data);
// second way
shallowCopy = (Map<String, Object>) ((HashMap<String, Object>) data).clone();
Une voie est-elle préférée à l'autre, et si oui, pourquoi?
Une chose qui mérite d'être mentionnée est que la deuxième méthode donne un avertissement "Cast non coché". Il faut donc en rajouter @SuppressWarnings("unchecked")
pour le contourner, ce qui est un peu irritant (voir ci-dessous).
@SuppressWarnings("unchecked")
public Map<String, Object> getDataAsMap() {
// return a shallow copy of the data map
return (Map<String, Object>) ((HashMap<String, Object>) data).clone();
}
Réponses:
Il est toujours préférable de copier en utilisant un constructeur de copie.
clone()
en Java est cassé (voir SO: Comment remplacer correctement la méthode de clonage? ).Josh Bloch sur la conception - Constructeur de copie versus clonage
Bloch (qui d'ailleurs a conçu et implémenté le framework Collection) est même allé plus loin en disant qu'il ne fournit la
clone()
méthode que «parce que les gens l'attendent». Il ne recommande PAS du tout de l'utiliser.Je pense que le débat le plus intéressant est de savoir si un constructeur de copie est meilleur qu'une usine de copie, mais c'est une discussion complètement différente.
la source
Ni l'un ni l'autre: le constructeur auquel vous faites référence est défini pour l' implémentation HashMap d'un Map , (ainsi que pour d'autres) mais pas pour l'interface Map elle-même (par exemple, considérez l' implémentation Provider de l'interface Map: vous ne trouvera pas ce constructeur).
En revanche, il n'est pas conseillé d'utiliser la
clone()
méthode, comme l'explique Josh Bloch.En ce qui concerne l'interface Map (et votre question, dans laquelle vous demandez comment copier une Map, pas un HashMap), vous devez utiliser Map # putAll () :
Exemple:
la source
Map
dont a un constructeur de copie, il n'y a aucune raison de ne pas utiliser le constructeur de copie alors?putAll
vous n'avez pas besoin de savoir si l'Map
implémentation que vous utilisez a un constructeur de copie ou non. Un simple constructeur de copie de touteMap
implémentation est donc redondant.Copiez une carte sans connaître sa mise en œuvre:
la source
<K,V>
des paramètres de type pour garantir la sécurité du type.