2012-05-17 32 views
11

Xin lỗi cho một câu hỏi mới, nhưng cách tốt nhất để sao chép/sao chép một đối tượng trong java/android là gì?làm thế nào để sao chép một đối tượng trong Android?

rlBodyDataObj rlbo = bdoTable.get(name); 

ngay bây giờ mã gán một đối tượng từ một hashTable, nhưng tôi cần tạo bản sao của nó, để tôi có thể sử dụng nó nhiều lần.

Cảm ơn!

+0

Có lẽ sử dụng clone()? –

+0

Xem câu trả lời này http://stackoverflow.com/questions/869033/how-do-i-copy-an-object-in-java –

+0

đó là đối tượng tùy chỉnh của tôi, nó không có .clone() –

Trả lời

16

Hãy chắc chắn rằng lớp DataObj bạn thực hiện Cloneable và thêm các phương pháp sau đây

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

Sau đó, bạn sẽ có thể gọi số (DataObj) rlBodyDataObj.clone(); để có được một bản sao sạch (lưu ý các diễn viên).

+0

Có! Cảm ơn, nó đã hoạt động! : =) –

+0

hmm ... không thực sự, vui lòng xem câu hỏi này :) http://stackoverflow.com/questions/10636673/android-cloned-object-also-clones-new-data-how-to-prevent-that –

+0

Bạn không cần phải thêm phương thức. – EJP

1

Đôi khi bạn cần phải sửa đổi một số trường trước khi trở về từ phương thức sao chép().

Kiểm tra điều này: http://docs.oracle.com/javase/1.4.2/docs/api/java/lang/Object.html#clone(). tôi dán phần có liên quan vào đây để tiện theo dõi:.

"Theo quy ước, đối tượng được trả về bởi phương pháp này nên độc lập của đối tượng này (mà đã được nhân bản) Để đạt được độc lập này, nó có thể là cần thiết để sửa đổi một hoặc nhiều trường của đối tượng được trả về bởi super.clone trước khi trả về.Thông thường, này có nghĩa là sao chép bất kỳ đối tượng có thể thay đổi nào được bao gồm cấu trúc "sâu " của đối tượng đang được nhân bản và thay thế các tham chiếu đến các đối tượng này với tham chiếu đến các bản sao. Nếu một lớp chỉ chứa các trường nguyên thủy hoặc tham chiếu đến bất biến các đối tượng e, sau đó nó là thường là trường hợp không có trường nào trong đối tượng được trả về bởi super.clone cần được sửa đổi. "

+0

cảm ơn. hãy xem http://stackoverflow.com/questions/10636673/android-cloned-object-also-clones-new-data-how-to-prevent-that này, dường như nó nhân bản các đối tượng tích hợp được gán sau SAU .clone() đã diễn ra ... –

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

bạn có thể thực hiện Parcelable (dễ dàng với plugin phòng thu), và sau đó

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; 
} 
Các vấn đề liên quan