2012-05-17 35 views
11

Yeni bir soru için üzgünüm, ama java/android'da bir nesneyi kopyalamak/kopyalamak için en iyi yol hangisidir?android bir nesneyi klonlama nasıl?

rlBodyDataObj rlbo = bdoTable.get(name); 

şu anda kod Hashtable'ın bir nesne atar, ama ben bunu defalarca kullanmak mümkün olurdu ki ben, bunun bir klon almak gerekir.

Teşekkürler!

+0

Belki (klon kullanılır? –

+0

Bu yanıtı gözden geçirin http://stackoverflow.com/questions/869033/how-do-i-copy-an-object-in-java –

+0

bu benim özel nesnem, bu yok .clone() –

cevap

16

(sizin DataObj sınıf klonlanamaz uygular emin olun ve (DataObj) rlBodyDataObj.clone çağırmak gerekir aşağıdaki yöntemi Sonra

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

ekleyin); temiz bir kopyasını almak için (notu not alın).

+0

Evet! Teşekkürler, işe yaradı! : =) –

+0

hmm ... gerçekten değil, lütfen şu soruya bakın :) http://stackoverflow.com/questions/10636673/android-cloned-object-also-clones-new-data-how-to-prevent-that –

+0

Yöntemi eklemeniz gerekmez. – EJP

1

Bazen clone() yönteminden dönmeden önce bazı alanları değiştirmeniz gerekir.

Şunlara dikkat edin: http://docs.oracle.com/javase/1.4.2/docs/api/java/lang/Object.html#clone(). Ben kolaylık olması açısından burada ilgili kısmını yapıştırılan:. Geleneksel olarak

", bu yöntemle döndürülen nesne (klonlanmış ediliyor) bu nesnenin bağımsız olmalıdır bu bağımsızlık elde etmek için, gerekli olabilir geri dönmeden önce super.clone tarafından döndürülen nesnesinin bir veya daha fazla alanını değiştirmek için kullanılır. Genellikle, bu , klonlanan nesnenin iç "derin yapısını" içeren ve bu nesneleri bu nesnelerle değiştiren tüm değiştirilebilir nesneleri kopyalamak anlamına gelir. Kopyalara referansla, eğer bir sınıf sadece ilkel alanlar içeriyorsa veya immutabl'a referanslar içeriyorsa e nesneler, daha sonra genellikle super.clone tarafından döndürülen nesnenin hiçbir alanın değiştirilmesinin gerekmediği durumdur. "

+0

teşekkürler. lütfen bu http://stackoverflow.com/questions/10636673/android-cloned-object-also-clones-new-data-how-to-prevent- adresine bakın, AFTER tarafından atanan tümleşik nesneleri klonlamış gibi görünüyor. .clone() gerçekleşti ... –

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

) Eğer (stüdyo eklentisi ile kolay) Parcelable uygular ve daha sonra

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; 
}