Tại sao phương thức .clone()
được chỉ định trong giao diện java.lang.Cloneable
?Java: Lý do của giao diện Cloneable
Trả lời
Về cơ bản, đó là một giao diện bị hỏng. Ken Arnold và Bill Venners đã thảo luận nó trong Java Design Issues.
Arnold:
Nếu tôi được làm Đức Chúa Trời vào thời điểm này, và nhiều người có lẽ vui mừng tôi không, tôi sẽ nói không dùng
Cloneable
và có mộtCopyable
, vìCloneable
có vấn đề. Bên cạnh thực tế là nó sai chính tả,Cloneable
không chứa phương thứcclone
. Điều đó có nghĩa là bạn không thể kiểm tra xem có gì đó là một phiên bản củaCloneable
, truyền nó đếnCloneable
và gọiclone
. Bạn phải sử dụng sự phản chiếu một lần nữa, điều đó thật khủng khiếp. Đó chỉ là một vấn đề, nhưng tôi chắc chắn sẽ giải quyết.
Xem lỗi này trong cơ sở dữ liệu lỗi Java:
http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4098033
Về cơ bản, đây là một lỗ hổng thiết kế trong các phiên bản trước của Java rằng họ không có ý định để sửa chữa trong giao diện Cloneable như làm như vậy sẽ phá vỡ khả năng tương thích với một số mã hiện có.
Tôi tự hỏi tại sao họ không thêm giao diện 'có thể sao chép 'vào Java 1.2 và hơn thế nữa ... – EpicPandaForce
@EpicPandaForce Có lẽ vì chúng tôi không muốn bắt chước C++ trong một số trường hợp nhất định. Nhân bản nên được sử dụng cẩn thận, phần lớn thời gian nó không đạt được những gì bạn muốn nó đạt được. Điều còn thiếu trong Java là có các tham số 'const', nhưng việc sao chép mọi thể hiện đối tượng (có thể thay đổi) không phải là một giải pháp tốt. Và có, có một số thứ mà Java hút, và đây là một trong số đó.Sử dụng Kotlin/lớp dữ liệu. –
Vì phương pháp sao chép được triển khai trong lớp Đối tượng do điều kiện "đặc biệt" của nó: bản sao bộ nhớ của các đối tượng thuộc bất kỳ loại nào.
Trong Java, có khái niệm về giao diện điểm đánh dấu này. Giao diện Cloneable
không có phương thức hoặc trường nào và chỉ phục vụ để xác định ngữ nghĩa của việc được nhân bản.
từ trang web dev-x:
Thông thường bạn sẽ đi qua các giao diện trong Java mà không có hành vi. Nói cách khác, chúng chỉ là định nghĩa giao diện trống. Chúng được gọi là giao diện điểm đánh dấu. Một số ví dụ về các giao diện đánh dấu trong API Java bao gồm:
Tôi không nghĩ đó là một khái niệm lạ. Đôi khi rất hữu ích khi có thể xem liệu một thứ gì đó có thể hoạt động như một loại thay thế hay không. Như những người khác đã nói, Cloneable bị phá vỡ mặc dù. –
Chúng được cho là hoạt động như mixin. Không phải cơ chế yêu thích của tôi trong một ngôn ngữ được đánh máy mạnh như java nhưng nó có ý nghĩa đối với Serializable, sorta. – wds
@Serializable sẽ có ý nghĩa hơn. Hoặc ít nhất nó sẽ làm nếu chú thích đến một thập kỷ trước đó. –
Về dự án tôi làm việc, chúng tôi đã tạo một giao diện có tên là PublicCloneable, nó chứa phương thức sao chép và chỉ định phương thức đó là công khai.
Tôi thấy điều này hữu ích: thực tế là có một phương pháp sao chép, nhưng bạn không thể truy cập nó không giúp ích gì nhiều.
public interface PublicCloneable extends Cloneable {
public Object clone();
}
Điều gì sẽ là cách để sử dụng giao diện này (PublicConeable)? – Otto
@Otto: ví dụ, một CloneHelper với phương thức tĩnh PublicCloneable copy (PublicCloneable obj), kiểm tra null hoặc chỉ sao chép (Object obj), và kiểm tra cả null và instanceof PublicCloneable –
Khi bạn trả về một đối tượng từ một local bộ nhớ cache cho ví dụ ... Điều đó nói rằng, serializing/deserializing có lẽ là an toàn hơn. –
- 1. Lẫn lộn về giao diện cloneable và Object.clone() trong java
- 2. Tại sao #clone() không có trong giao diện Cloneable?
- 3. Lý do đằng sau giao diện người dùng Office 2007
- 4. Lý do cho hạn chế chuỗi giao diện .NET UI
- 5. Giao diện Java API
- 6. lý do dịch vụ của tôi chặn giao diện người dùng?
- 7. Java - Giao diện, khởi tạo một giao diện?
- 8. thực hiện dự phòng của giao diện List trong ArrayList.java
- 9. Sử dụng Java Generics trong giao diện
- 10. Lý do đằng sau Nguyên tắc phân đoạn giao diện là gì?
- 11. lý do tại sao không có phương thức thêm trong giao diện Iterator
- 12. Giao diện R sang Java
- 13. Java - Thực hiện giao diện
- 14. Thực hiện giao diện Java trong MATLAB
- 15. Mảng giao diện trong Java
- 16. Lý do không sử dụng lớp trừu tượng thay vì giao diện?
- 17. truy vấn về giao diện trong Java
- 18. quản lý giao diện trong Rails
- 19. Java ORM: Nhiều (giao diện) thừa kế
- 20. Giao diện web của Subversion
- 21. C++ Cloneable mixin
- 22. java.util.List là một giao diện, và JAXB không thể xử lý giao diện
- 23. Truy cập giao diện mặc định của giao diện?
- 24. điểm trong việc cho phép lớp học của tôi thực hiện Cloneable là gì?
- 25. Cấu trúc thư mục giao diện Java?
- 26. Xác định lý do của System.AccessViolationException
- 27. Giao diện Java mở rộng So sánh
- 28. giao diện tĩnh trong java là gì?
- 29. lý do tại sao chúng ta cần giao diện thay vì lớp và những gì chúng ta đang đạt được từ giao diện
- 30. Java - Giao diện mở rộng chính nó
Thiết kế ngớ ngẩn. Tôi tự hỏi tại sao Sun không bao giờ sửa lỗi này. – tactoth
Tại sao nó không được sửa trong Java 8? Các phần không bị hỏng/không hiệu quả của Java đã bị xóa/thay đổi trước đó chưa? –
Đó là "bị hỏng" vì một vài người nói như vậy? "Cloneable không chứa phương pháp sao chép" Có, và tài liệu của nó không bao giờ nói nó sẽ. "Điều đó có nghĩa là bạn không thể kiểm tra nếu một cái gì đó là một thể hiện của Cloneable, đưa nó vào Cloneable, và gọi clone." Một lần nữa, đó không phải là mục đích của 'Cloneable' cả. 'Cloneable' chỉ là để làm cho' Object.clone() 'ném một ngoại lệ hay không. Nó chưa bao giờ là một giao diện để bạn gọi 'clone'. Có lẽ nó sẽ được tốt đẹp nếu Java có một giao diện như vậy, nhưng thiếu một trong những không làm cho một giao diện ('Cloneable') bị hỏng. – newacct