2012-05-17 10 views
11

Lo siento por una pregunta de novato, pero ¿cuál sería la mejor manera de copiar/clonar un objeto en java/android?cómo clonar un objeto en Android?

rlBodyDataObj rlbo = bdoTable.get(name); 

ahora mismo código asigna un objeto a partir de una tabla hash, sin embargo, necesita obtener un clon de ella, por lo que me gustaría ser capaz de utilizarlo varias veces.

Gracias!

+0

utilizar lo mejor clon()? –

+0

Echa un vistazo a esta respuesta http://stackoverflow.com/questions/869033/how-do-i-copy-an-object-in-java –

+0

ese es mi objeto personalizado, no tiene .clone() –

Respuesta

16

Asegúrese de que su clase implementa dataobj Cloneable y añadir el siguiente método

protected Object clone() throws CloneNotSupportedException { 
     return super.clone(); 
} 

Entonces usted debe ser capaz de llamar (dataobj) rlBodyDataObj.clone(); para obtener una copia limpia (tenga en cuenta el elenco).

+0

¡Sí! Gracias, funcionó! : =) –

+0

hmm ... realmente no, por favor vea esta pregunta :) http://stackoverflow.com/questions/10636673/android-cloned-object-also-clones-new-data-how-to-prevent-hat –

+0

No es necesario que agregue el método. – EJP

1

Algunas veces necesita modificar algunos campos antes de regresar del método clone().

Compruebe esto: http://docs.oracle.com/javase/1.4.2/docs/api/java/lang/Object.html#clone(). Pegué la parte pertinente aquí por conveniencia:.

"Por convención, el objeto devuelto por este método debería ser independiente de este objeto (que está siendo clonado) Para lograr esta independencia , puede ser necesario para modificar uno o más campos del objeto devuelto por super.clone antes de devolverlo. Normalmente, este significa copiar cualquier objeto mutable que comprenda la estructura interna "profunda " del objeto que se está clonando y reemplazar las referencias a estos objetos con referencias a las copias. Si una clase contiene solo campos primitivos o referencias a immutabl e los objetos, entonces es por lo general el caso de que ningún campo en el objeto devuelto por super.clone necesita ser modificado. "

+0

gracias. eche un vistazo a este http://stackoverflow.com/questions/10636673/android-cloned-object-also-clones-new-data-how-to-prevent-that, parece que clona objetos integrados que se asignaron DESPUÉS de la .clone() tuvo lugar ... –

5
class Test implements Cloneable 
    { 
    ... 
     public Object clone() 
     { 
      try 
     { 
       return super.clone(); 
      } 
     catch(CloneNotSupportedException e) 
     { 
       return null; 
      } 
     } 
    ... 
    } 
2

puede implementa parcelable (Fácil con el estudio de plug-in), y luego

public static <T extends Parcelable> T copy(T orig) { 
    Parcel p = Parcel.obtain(); 
    orig.writeToParcel(p, 0); 
    p.setDataPosition(0); 
    T copy = null; 
    try { 
     copy = (T) orig.getClass().getDeclaredConstructor(new Class[]{Parcel.class}).newInstance(p); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    return copy; 
}