ordenado example ejemplo java map clone shallow-copy

example - Copia superficial de un mapa en Java



map ordenado java (3)

Copie un mapa sin conocer su implementación:

static final Map shallowCopy(final Map source) throws Exception { final Map newMap = source.getClass().newInstance(); newMap.putAll(source); return newMap; }

Según lo entiendo, hay un par de formas (tal vez otras también) de crear una copia superficial de 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();

¿Se prefiere una manera sobre la otra, y si es así, por qué?

Una cosa que vale la pena mencionar es que la segunda forma da una advertencia de "Lanzamiento no verificado". Por lo tanto, debe agregar @SuppressWarnings("unchecked") para @SuppressWarnings("unchecked") , lo que es un poco irritante (ver más abajo).

@SuppressWarnings("unchecked") public Map<String, Object> getDataAsMap() { // return a shallow copy of the data map return (Map<String, Object>) ((HashMap<String, Object>) data).clone(); }


Ninguno de los dos: el constructor que se refiere está definido para la implementación HashMap de un Map (y para otros), pero no para la interfaz del Mapa en sí (por ejemplo, considere la implementación del Provider de la interfaz del Mapa: no encontrará ese constructor).

Por otro lado, no es aconsejable utilizar el método clone() , como explica Josh Bloch.

Con respecto a la interfaz del Mapa (y de su pregunta, en la que pregunta cómo copiar un Mapa, no un HashMap), debe usar Map#putAll() :

Copia todas las asignaciones del mapa especificado a este mapa (operación opcional). El efecto de esta llamada es equivalente al de poner put (k, v) en este mapa una vez para cada mapeo desde la clave k hasta el valor v en el mapa especificado.

Ejemplo:

// HashMap here, but it works for every implementation of the Map interface Map<String, Object> data = new HashMap<String, Object>(); Map<String, Object> shallowCopy = new HashMap<String, Object>(); shallowCopy.putAll(data);


Siempre es mejor copiar usando un constructor de copia. clone() en Java está roto (ver SO: ¿Cómo anular correctamente el método de clonación? ).

Josh Bloch en diseño - Copy Constructor versus Cloning

Si has leído el artículo sobre la clonación en mi libro, especialmente si lees entre líneas, sabrás que creo que el clone está profundamente roto. [...] Es una pena que Cloneable esté roto, pero sucede.

Bloch (quien, por cierto, diseñó e implementó el marco de Collection) incluso fue más lejos al decir que solo proporciona el método clone() simplemente "porque la gente lo espera". Él realmente NO recomienda usarlo en absoluto.

Creo que el debate más interesante es si un constructor de copias es mejor que una fábrica de copias, pero esa es una discusión diferente por completo.