Pelo que entendi, existem algumas maneiras (talvez outras também) de criar uma cópia superficial de um Map
em 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();
Uma forma é preferida à outra e, em caso afirmativo, por quê?
Uma coisa que vale a pena mencionar é que a segunda forma dá um aviso de "Elenco não verificado". Então você tem que adicionar @SuppressWarnings("unchecked")
para contornar isso, o que é um pouco irritante (veja abaixo).
@SuppressWarnings("unchecked")
public Map<String, Object> getDataAsMap() {
// return a shallow copy of the data map
return (Map<String, Object>) ((HashMap<String, Object>) data).clone();
}
java
map
clone
shallow-copy
dcp
fonte
fonte
Respostas:
É sempre melhor copiar usando um construtor de cópia.
clone()
em Java está quebrado (consulte SO: Como substituir corretamente o método de clone? ).Josh Bloch no projeto - Construtor de cópia versus clonagem
Bloch (que, a propósito, projetou e implementou o framework Collection) foi ainda mais longe ao dizer que ele só fornece o
clone()
método apenas "porque as pessoas o esperam". Na verdade, ele NÃO recomenda usá-lo.Acho que o debate mais interessante é se um construtor de cópias é melhor do que uma fábrica de cópias, mas essa é uma discussão totalmente diferente.
fonte
Nenhum dos dois: o construtor ao qual você está se referindo é definido para a implementação HashMap de um Mapa , (bem como para outros), mas não para a própria interface do Mapa (por exemplo, considere a implementação do Provedor da interface do Mapa: você não encontrará esse construtor).
Por outro lado, não é aconselhável usar o
clone()
método, conforme explica Josh Bloch.Em relação à interface do Mapa (e de sua pergunta, na qual você pergunta como copiar um Mapa, não um HashMap), você deve usar Map # putAll () :
Exemplo:
fonte
Map
que tem um construtor de cópia, não há razão para não usar o construtor de cópia então?putAll
que você não precisa de saber se aMap
aplicação que você está usando tem um construtor de cópia ou não. Um construtor de simples cópia de qualquerMap
implementação é, portanto, redundante.Copie um mapa sem saber sua implementação:
fonte
<K,V>
parâmetros de tipo para ajudar a garantir a segurança do tipo.