Trong các loại tình huống này, có ba giải pháp chung:
(1) Nếu bạn biết rằng các yếu tố cá nhân có clone() phương pháp mà làm việc như bạn có ý định, tạo ra một mảng mới và điền nó với bản sao() của mỗi phần tử tương ứng. Theo nguyên tắc chung, các đối tượng "cơ bản" từ JDK chẳng hạn như Strings, các biểu diễn số, v.v. sẽ ổn. Một bất lợi của clone() là nó là một chút của một 'pháo lỏng': bạn không biết một ưu tiên chính xác độ sâu 'bản sao' sẽ là nếu phương pháp đã bị ghi đè cho một lớp cụ thể và những tham chiếu nào có khả năng tái sử dụng hay không. Nó cũng có một nguy cơ cụ thể là rằng các lớp con của các đối tượng có thể nhân bản dựa trên logic trong hàm khởi tạo của chúng có trách nhiệm không hoạt động. Nhưng như tôi đã nói, các đối tượng JDK đơn giản sẽ ổn.
(2) Nối tiếp danh sách vào ObjectOutputStream được bao quanh một ByteArrayOutputStream. Sau đó lấy mảng byte kết quả, và bọc một ByteArrayInputStream và ObjectInputStream xung quanh nó và đọc từ đó một bản sao mới sâu của danh sách.
(3) Trong một thế giới lý tưởng, hãy tạo một danh sách mới, điền vào một danh sách mới, điền vào nó được tạo rõ ràng "bản sao" của các đối tượng được đề cập. Trường hợp nó không quá cồng kềnh với mã, đây là giải pháp lý tưởng vì bạn 'biết những gì đang thực sự xảy ra': sẽ không có bất ngờ tiềm ẩn nào về các đối tượng vô tình được tham chiếu lại thay vì được tạo lại bởi vì ví dụ: phương thức clone() không hoạt động như bạn mong đợi.
Khi bạn có đối tượng chứa đơn giản (danh sách mảng) có cấu trúc bạn có thể dễ dàng tạo lại, thì (2) có thể quá mức cần thiết. Nó có thể thuận tiện cho việc tái tạo các cấu trúc phức tạp hơn.
Re (1), bạn phải là đặc biệt đáng ngờ khi sao chép các đối tượng từ thư viện của bên thứ ba nơi các đối tượng không được thiết kế đặc biệt với bản sao(). Vấn đề là mọi người dễ dàng phân lớp lớp JDK (cloneable) hoặc phương thức clone() khác mà không thực sự suy nghĩ chi tiết - theo kinh nghiệm của tôi, clone() có một số tinh tế mà nhiều nhà phát triển không nhận thức được (ví dụ như các nhà xây dựng không nhận được gọi trên đối tượng mới) mà có thể dẫn đến các vấn đề unanticipated. Vì vậy, nếu bạn không thể nhìn thấy mã nguồn đáng tin cậy để chắc chắn rằng bản sao() sẽ an toàn, tôi sẽ tránh nó.
Nguồn
2012-05-08 09:32:46
Hãy xem http://stackoverflow.com/questions/869033/how-do-i-copy-an-object-in-java – DonCallisto
Bạn có nghĩa là danh sách mới của bạn sẽ không thay đổi nếu các mục được thêm/xóa trong danh sách gốc? Hay bạn cũng muốn đảm bảo rằng các mục trong danh sách của bạn không thể sửa đổi được? – assylias