2012-12-27 42 views
7

Tại sao đoạn mã sau ném CloneNotSupportedException trong JDK7 nhưng KHÔNG ở trong JDK6?CloneNotSupportedException ngay cả khi triển khai Cloneable

public class DemoThread extends Thread implements Cloneable { 

    /** 
    * @param args 
    */ 
    public static void main(String[] args) { 
     DemoThread t = new DemoThread(); 
     t.cloned(); 
    } 

    public DemoThread cloned() 
    { 
     try { 
      return (DemoThread) super.clone(); 
     } catch (CloneNotSupportedException e) { 
      e.printStackTrace(); 
     } 
     return null; 
    } 

} 
+3

Rõ ràng, phương pháp đã được thay đổi theo cách giải thích sau trong javadocs: 'Ném CloneNotSupportedException dưới dạng Chủ đề không thể được nhân bản một cách có ý nghĩa.' –

+0

sẽ giúp ích nếu bạn bao gồm dấu vết ngăn xếp – radai

Trả lời

6

Dưới đây là thực hiện chủ đề của clone() trong SE 7

/** 
* Throws CloneNotSupportedException as a Thread can not be meaningfully 
* cloned. Construct a new Thread instead. 
* 
* @throws CloneNotSupportedException 
*   always 
*/ 
@Override 
protected Object clone() throws CloneNotSupportedException { 
    throw new CloneNotSupportedException(); 
} 

Chủ đề chưa bao giờ được thiết kế để được nhân bản. Làm một số đọc gây ra một trong những ý kiến ​​tôi thấy điều này tóm tắt nó lên khá: "But we either have to disallow cloning or give it meaningful semantics - and the latter isn't going to happen." - David Holmes

+0

Chúng ta có thể xem mã nguồn để xem. Câu hỏi đặt ra là tại sao nó không được thực hiện theo cách như vậy trong các phiên bản trước của JDK. –

+0

Có thể là do chúng đã tạo ra lỗi thiết kế bằng cách thực hiện Thread cloneable, và sửa lỗi thiết kế này trong JDK7. –

+1

Tìm thấy nội dung nào đó có liên quan - http://weblog.ikvm.net/PermaLink.aspx?guid=23cced47-ccdb-460d-acc9-ce16154ab6a5 – Manish

3

Điều này không hoạt động vì chủ đề không thể nhân bản. Dòng 16 của mã của bạn cố gắng sao chép các siêu lớp (Thread) mà không thực hiện giao diện Cloneable. Bên cạnh đó nhân bản một sợi không phải là một ý tưởng tốt cả. Bạn cần phải tạo một chủ đề mới. Đó là giải pháp duy nhất có thể ở đây. Hình minh hoạ

+0

Lưu ý rằng đối với một lớp là Cloneable, nó không phải là một yêu cầu mà các lớp siêu thực hiện của nó Cloneable quá. Sau khi tất cả các đối tượng không thực hiện Cloneable hoặc. – bowmore

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