Bạn có nhất thiết phải sử dụng clone
không? Hầu hết mọi người đồng ý rằng Java clone
bị hỏng.
Josh Bloch về thiết kế - Copy Constructor so với Cloning
Nếu bạn đã đọc mục về nhân bản trong cuốn sách của tôi, đặc biệt là nếu bạn đọc giữa các dòng, bạn sẽ biết rằng tôi nghĩ rằng tôi rất suy clone
sụp. [...] Thật xấu hổ khi Cloneable
bị phá vỡ, nhưng nó sẽ xảy ra.
Bạn có thể đọc thêm thảo luận về chủ đề này trong cuốn sách Hiệu quả Java lần 2, Mục 11: Ghi đè clone
một cách thận trọng . Thay vào đó, ông khuyến nghị nên sử dụng một công cụ tạo bản sao hoặc nhà máy sao chép.
Anh ấy tiếp tục viết các trang về cách thức, nếu bạn cảm thấy phải thực hiện, bạn nên thực hiện clone
. Nhưng anh ấy đã kết thúc với điều này:
Tất cả những điều phức tạp này có thực sự cần thiết? Ít khi. Nếu bạn mở rộng một lớp thực thi Cloneable
, bạn có ít lựa chọn ngoài việc triển khai một clone
phương thức hoạt động tốt . Nếu không, bạn nên cung cấp các phương tiện sao chép đối tượng thay thế, hoặc đơn giản là không cung cấp khả năng .
Điểm nhấn là của anh ấy, không phải của tôi.
Vì bạn đã nói rõ rằng bạn không có lựa chọn nào khác ngoài việc triển khai clone
, đây là những gì bạn có thể làm trong trường hợp này: hãy đảm bảo điều đó MyObject extends java.lang.Object implements java.lang.Cloneable
. Nếu đúng như vậy, thì bạn có thể đảm bảo rằng bạn sẽ KHÔNG BAO GIỜ mắc phải a CloneNotSupportedException
. Việc ném AssertionError
như một số người đã đề xuất có vẻ hợp lý, nhưng bạn cũng có thể thêm nhận xét giải thích lý do tại sao khối bắt sẽ không bao giờ được nhập trong trường hợp cụ thể này .
Ngoài ra, như những người khác cũng đã đề xuất, bạn có thể thực hiện clone
mà không cần gọi super.clone
.
Cloneable
thì việc ném mộtAssertionError
thay vì chỉ đơn thuầnError
là một cách biểu đạt hơn một chút.