2010-08-04 41 views
7

Tôi đã nghiên cứu Java là truyền tham chiếu đối tượng theo giá trị, và để tạo một bản sao cục bộ của một đối tượng, tôi có thể làm bản sao() hoặc copy-constructor. Tôi cũng đã xem bản sao sâu/nông cũng như một số bài đăng trên stackoverflow.Làm thế nào để tạo một bản sao đối tượng ArrayList là loại Danh sách?

Bây giờ tôi nhìn vào ví dụ:

List<String> list = new ArrayList<String>(); 
String one = "one" 
list.add(one); 

Vài điều tôi đọc chỉ đề cập đến mà ArrayList thực hiện cloneable nhưng không thực sự nói như thế nào để tạo ra một bản sao cục bộ của "danh sách" nếu loại là Danh sách không ArrayList mà không thực hiện cloneable.

Tôi có thể gọi clone() nếu "danh sách" là loại ArrayList.

ArrayList<String> list = new ArrayList<String(); 
list.clone(); 

Nhưng nếu loại là Danh sách, tôi không thể.

Tôi có nên chỉ sử dụng hàm tạo bản sao như dưới đây để tạo bản sao cục bộ không? Cách tốt nhất để tạo bản sao "danh sách" là gì?

List<String> tmpList = new ArrayList<String>(list); 

Trả lời

5

Việc chuyển danh sách vào hàm tạo có lẽ là cách tốt nhất để thực hiện. Bản thân lời gọi hàm tạo sẽ sử dụng, đằng sau hậu trường, System.arraycopy. Vì vậy, nó sẽ có hiệu quả tách bản sao cục bộ khỏi danh sách được truyền qua thông qua hàm tạo.

0

Sử dụng hàm tạo bản sao bất cứ khi nào bạn có thể. clone() đã lỗi thời và không được sử dụng (không được triển khai) trong mã mới.

Nếu bạn mở rộng một lớp thực hiện Cloneable, bạn phải lựa chọn ít nhưng để thực hiện một well-behaved clone phương pháp. Nếu không, bạn nên cung cấp phương tiện thay thế sao chép đối tượng hoặc đơn giản là không cung cấp khả năng. [...] Cách tiếp cận tốt để sao chép đối tượng là cung cấp một nhà xây dựng bản sao sao chép hoặc sao chép nhà máy. [...]

Với tất cả những vấn đề liên quan đến Cloneable, nó là an toàn để nói rằng giao diện khác không nên mở rộng nó, và rằng các lớp học được thiết kế cho các thừa kế (khoản 17) không nên thực hiện nó. Vì có nhiều thiếu sót, một số lập trình viên chuyên nghiệp chỉ đơn giản là chọn không bao giờ ghi đè phương pháp clone và không bao giờ để gọi nó ngoại trừ, có lẽ, để sao chép mảng.

Từ Effective Java 2nd Edition khoản 11.

+0

Tôi không hiểu. Tất cả các "vấn đề liên quan đến Cloneable" là gì, và tại sao chúng lại tệ đến mức bạn không bao giờ nên thậm chí _invoke_ nó? –

+1

@RussellSilva, http://jtechies.blogspot.hu/2012/07/item-11-override-clone-judiciously.html –

0

Dường bởi câu hỏi mà bạn muốn thực hiện bộ sưu tập của bạn chưa sửa đổi, do đó bạn có thể sử dụng Collections.unmodifiableList().

Các vấn đề liên quan