[英]Using the clone method without catching CloneNotSupportedException
[英]Making a clone function without throwing CloneNotSupportedException exception in Java
作為我們作業的一部分,我們被要求用clone
方法實現一個抽象類。 該函數的框架給出:
/**
* @effects Creates and returns a copy of this.
*/
public Object clone() {
// TODO: Implement this method
}
Shape
類有兩個字段:
private Point location;
private Color color;
在說明中,我們被告知該方法不會拋出CloneNotSupportedException
異常,並且還會詢問它為什么會這樣。 在我們在互聯網上看到的所有示例中,clone方法都會拋出CloneNotSupportedException
。
您能否指出我們為什么這個克隆方法不應拋出該異常的原因。
我們編寫的方法是:
/**
* @effects Creates and returns a copy of this.
*/
public Object clone() {
Shape new_shape = (Shape)super.clone();
new_shape.setColor(this.getColor());
new_shape.location = (Point)location.clone();
return new_shape;
}
它給我們一個錯誤的(Shape)super.clone()
部分,說:
Unhandled exception type CloneNotSupportedException
,我們應該如何創建克隆方法?
您的類應該實現Clonable接口。
您也可以使用Covariant返回類型返回Shape / Point而不是Object。 這有助於您避免不必要的類型轉換。
未處理的異常類型CloneNotSupportedException
那是因為Object
的clone()
方法被定義為拋出CloneNotSupportedException
:
protected Object clone() throws CloneNotSupportedException
請參閱API doc: Object#clone()
要解決這個問題,您需要使用try/catch
塊來處理它,或者通過添加throws
子句來重新定義它。
更新:
在說明中,我們被告知該方法不會拋出CloneNotSupportedException異常,並且還會詢問它為什么會這樣。
IMO -
Cloneable
接口時,它告訴Object
類可以克隆它。 在這種情況下, clone
方法的正確實現應該調用super.clone
方法。 現在,您可以看到它實際上是Object
類中實際生成副本的clone
方法。 因此,我們應該留下Object.clone()
來拋出CloneNotSupportedException
。 如果層次結構中的任何類未實現Cloneable
接口,它將執行此操作。 我希望這是有道理的。
即使它有點大,如果你想更多地閱讀它。 它在Effective Java中有所解釋。
其他實現拋出CloneNotSupportedException的原因是它是Object的現有clone()方法的一部分 。 僅僅因為定義一個方法來拋出異常並不意味着它必須這樣做。 在Shape及其派生類上實現clone()方法時,不要拋出異常。
(Shape)super.clone()
拋出異常的原因是這是默認行為。 在Shape上實現clone()。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.