martes, 9 de marzo de 2010

Clone HashMap de HashMap

Si bien el otro día Sebas nos hablo del uso de las dobles llaves para sobrescribir el constructor de una clase anónima en java, no hemos tardado más de 2 días en necesitar usarlo.

El problema ha venido al intentar clonar un objeto del tipo HashMap con otro Map dentro. Esto se debe a que se intenta clonar un objeto que dentro tiene otro objeto, y para clonarlo se debe hacer la clonación por separado de dicho objeto.

Un modo de solucionarlo es declarar el tipo del Map que hay dentro del Map que se quiere clonar como final.Pero esto no siempre es posible.

El otro método que se nos ha ocurrido para solucionarlo ha sido emplear la inicialización de la doble llave, y el resultado ha sido algo de este estilo.

 HashMap cloned = new HashMap();

  for (Object key: reference.keySet()) {
    final Map map = reference.get(key);
    cloned.put(key, new HashMap() {{
      for (Entry entry: map.entrySet()) {
        put(entry.getKey(), entry.getValue());
      }
    }});
  }

Y esto es todo por hoy. Espero vuestras opiniones o soluciones alternativas.

3 comentarios:

  1. No termino de verlo. ¿La línea 5 no debería incluir el nuevo HashMap en cloned, en lugar de en reference? ¿de dónde a dónde se está copiando?

    ResponderEliminar
  2. Es verdad que ese trozo de código no se entiende muy bien fuera de su contexto...

    De todas formas no puedes utilizar el método clone porque sólo duplica el diccionario no los objetos referenciados.

    ResponderEliminar
  3. Tienes razón miguel, ahora mismo lo arreglo, ha sido un problema de copy & shit ;)

    Gracias

    ResponderEliminar