2011-06-01 13 views
6

amigos,¿Cómo crear una copia del mismo objeto con una referencia diferente?

me enfrento a un problema tengo una lista de contactos telefónicos con el nombre y los números de teléfono en ella. quiero copiarlo en dos listas estáticas diferentes para poder usarlo en otras actividades. Estoy usando el siguiente código pero me muestra las referencias de la última lista en ambos al recuperar los datos cualquiera me guía ¿cómo puedo tomar copias separadas de estos dos objetos?

MyContacts.attackContacts = new ArrayList(phoneContacts); 
Collections.copy(MyContacts.attackContacts,phoneContacts); 
MyContacts.attackContacts.get(0).setType("attack"); 

MyContacts.medicalContacts = new ArrayList(phoneContacts); 
Collections.copy(MyContacts.medicalContacts,phoneContacts); 
MyContacts.medicalContacts.get(0).setType("medical"); 

System.out.println("attack" + MyContacts.attackContacts.get(0).getType() + " medical " + MyContacts.medicalContacts.get(0).getType()); 

// result "attack medical" "medical medical" 
// it should show independent list results like "attack attack" "medical medical" 

cualquier ayuda sería apreciada.

Respuesta

10

En este caso, necesitaría hacer una copia profunda de la lista, es decir, una copia que no copie las referencias, pero en realidad copia el objeto al que apuntan las referencias.

Collections.copy "copia todos los elementos de una lista a otra". Como es habitual con Java, los elementos de una lista no son objetos sino referencias.

Usted podría resolver esto mediante la aplicación de Cloneable (y usando .clone()) o mediante la creación de una costumbre "constructor de copia", que toma un objeto a ser copiado, como argumento, y crea un nuevo objeto en base a los datos de ese argumento. No importa qué opción elija, tendrá que repetir la lista y realizar la copia en cada objeto.

Aquí hay un ejemplo que utiliza el enfoque de constructor de copia:

MyContacts.medicalContacts = new ArrayList(); 
for (Contact c: MyContacts.attackContacts) 
    medicalContacts.add(new Contact(c)); // add a copy of c. 

pregunta relacionada:

+0

gracias por la respuesta ningún ejemplo o tutorial? No tengo idea de ello, así que al usar el clon, cada lista señalará otra referencia nueva y obtendré el resultado que mencioné anteriormente. – UMAR

+0

* cada lista señalará otra referencia nueva y obtendré el resultado que mencioné anteriormente? * Exactamente, lo tienes. Se agregó un ejemplo. – aioobe

+0

tengo el tutorial correcto gracias por indicarme http://www.java2s.com/Code/Java/Language-Basics/DeepCopyTest.htm – UMAR

1

Hacer frente a la lista, crea nuevo objeto lista que sigue se refiere a los mismos objetos del elemento. Para hacer una copia profunda, su objeto de elemento debe ser clonable, tener un constructor de copia, o alguna otra forma de duplicarlo y debe hacer la copia en un bucle, uno por uno.

for (Elem x: list1) { 
    list2.add(copyOf(x)) 
} 
0

Pase el objeto que se agradece que quiere copiar y obtener el objeto que se quiere,

private Object copyObject(Object objSource) { 
 
\t \t try { 
 
\t \t \t ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
 
\t \t \t ObjectOutputStream oos = new ObjectOutputStream(bos); 
 
\t \t \t oos.writeObject(objSource); 
 
\t \t \t oos.flush(); 
 
\t \t \t oos.close(); 
 
\t \t \t bos.close(); 
 
\t \t \t byte[] byteData = bos.toByteArray(); 
 
\t \t \t ByteArrayInputStream bais = new ByteArrayInputStream(byteData); 
 
\t \t \t try { 
 
\t \t \t \t objDest = new ObjectInputStream(bais).readObject(); 
 
\t \t \t } catch (ClassNotFoundException e) { 
 
\t \t \t \t e.printStackTrace(); 
 
\t \t \t } 
 
\t \t } catch (IOException e) { 
 
\t \t \t e.printStackTrace(); 
 
\t \t } 
 
\t \t return objDest; 
 

 
\t }

CAST objDest al objeto Desiered

Cuestiones relacionadas