2009-04-02 35 views

Trả lời

36

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ột Copyable, 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ức clone. Đ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ủa Cloneable, truyền nó đến Cloneable và gọi clone. 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.

+0

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

+0

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? –

+3

Đó 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

10

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ó.

+0

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

+0

@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. –

1

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.

6

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:

+1

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ù. –

+0

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

+5

@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 đó. –

5

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(); 
} 
+1

Điều gì sẽ là cách để sử dụng giao diện này (PublicConeable)? – Otto

+0

@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 –

+0

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. –

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