2010-03-29 39 views
6

Có cách nào chung để đạt được sao chép đối tượng hiện có sang đối tượng khác không?Sao chép đối tượng vào một khác

Giả sử MyObj có trường idname. Như thế này:

MyObj myObj_1 = new MyObj(1, "Name 1"); 
MyObj myObj_2 = new MyObj(2, "Name 2"); 

Thay vì

myObj_2.setName(myObj_1.getName()) // etc for each field 

làm điều gì đó như sau:

myObj_2.copyFrom(myObj_1) 

để họ những trường khác nhau, nhưng có đặc tính tương đương.

+1

thấy http://stackoverflow.com/questions/64036/how-do-you-make-a-deep-copy-of-an-object – karlipoppins

+1

này [trả lời] (http: // stackoverflow. com/questions/869033/how-do-i-copy-an-đối tượng-trong-java/9834683 # 9834683) sẽ giúp bạn. –

Trả lời

4
+3

Mặc dù điều này là chính xác, Joshua Bloch cảnh báo chống lại việc sử dụng bản sao trong Java hiệu quả. Tốt hơn là tạo một hàm tạo bản sao. –

0

Các clone() - Phương pháp là cho chính xác công việc này.

8

Quy ước là thực hiện việc này vào thời gian xây dựng với một hàm tạo lấy một tham số thuộc loại riêng của nó.

MyObj myObj_2 = new MyObj (myObj_1);

Không có quy ước Java nào để ghi đè lên các thuộc tính hiện có của đối tượng từ đối tượng khác. Điều này có xu hướng đi ngược lại các ưu tiên cho các đối tượng bất biến trong Java (nơi các thuộc tính được thiết lập tại thời gian xây dựng, trừ khi có một lý do chính đáng để không).

Chỉnh sửa: liên quan đến clone(), nhiều kỹ sư không khuyến khích điều này trong Java hiện đại vì nó có cú pháp lỗi thời và các mặt hạn chế khác. http://www.javapractices.com/topic/TopicAction.do?Id=71

0

Bạn có thể sử dụng nội tâm để tự động hóa việc thực hiện các thói quen sao chép của mình, vì vậy bạn có thể an toàn mà không quên sao chép một số trường.

7

Sử dụng bản sao constructor:

public class YourObject { 
    private String name; 
    private int age; 

    public YourObject(YourObject other) { 
    this.name = other.name; 
    this.age = other.age; 
    } 
} 
0

Phương pháp clone() là thích hợp nhất cho các yêu cầu này. Bất cứ khi nào phương thức clone() được gọi trên một đối tượng, JVM sẽ thực sự tạo một đối tượng mới và sao chép tất cả nội dung của đối tượng trước đó vào đối tượng mới được tạo ra. Trước khi sử dụng phương thức clone(), bạn phải triển khai giao diện Cloneable và ghi đè phương thức clone().

public class CloneExample implements Cloneable 
{ 
    int id; 
    String name; 

    CloneExample(int id, String name) { 
     this.id = id; 
     this.name = name; 
    } 

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

    public static void main(String[] args) { 
     CloneExample obj1 = new CloneExample(1,"Name_1"); 

     try { 
      CloneExample obj2 = (CloneExample) obj1.clone(); 
      System.out.println(obj2.id); 
      System.out.println(obj2.name); 
     } catch (CloneNotSupportedException e) { 
      e.printStackTrace(); 
     } 
    } 
} 
Các vấn đề liên quan