2012-12-27 22 views
7

Aşağıdaki kod neden JDK7'de CloneNotSupportedException, ancak JDK6'da değil?Cloneable uygulandığında bile CloneNotSupportedException

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

Görünüşe göre, yöntem javadocs aşağıdaki gerekçe uyarınca değiştirildi: Bir Konu anlamlı olması Bunu görmek Biz kaynak koduna bakabilirsiniz yığın izini –

+0

yardımcı olacağını cloned.' olamaz gibi 'CloneNotSupportedException atar. Soru şu ki, JDK'nın önceki sürümlerinde böyle bir şekilde uygulanmadı. – radai

cevap

6

Burada konu klonlanmış üzere tasarlanmış hiçbir zaman

/** 
* 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(); 
} 

SE 7'de clone() iplik sitesinin uygulaması var. Bir miktar okuma yapmak, bunu buldukları yorumlardan birini kıstırmıştım, bunu çok iyi özetledim: "But we either have to disallow cloning or give it meaningful semantics - and the latter isn't going to happen." - David Holmes

+0

dahil eğer –

+0

Muhtemelen, Thread uygulama Cloneable yapılarak bir tasarım hatası yaptıklarından ve bu tasarım hatasını JDK7'de düzelttiklerinden dolayı. –

+1

Bir şeyle ilgili bulundu - http://weblog.ikvm.net/PermaLink.aspx?guid=23cced47-ccdb-460d-acc9-ce16154ab6a5 – Manish

3

Bu, iş parçacığı klonlanamadığı için işe yaramaz. Kodunuzun 16. satırı, Cloneable arabirimini uygulamayan süper sınıfı (Thread) klonlamaya çalışır. Bir iş parçacığının klonlanmasının yanı sıra, hiç de iyi bir fikir değildir. Yeni bir konu oluşturmalısınız. Burada mümkün olan tek çözüm budur.

+0

Bir sınıfın Cloneable olması için süper sınıfının uyguladığı bir gereklilik olmadığını unutmayın. Klonlanabilir. Her şeyden sonra Nesne de Cloneable uygulamıyor. – bowmore

İlgili konular