簡體   English   中英

在不拋出Java中的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

那是因為Objectclone()方法被定義為拋出CloneNotSupportedException

protected Object clone() throws CloneNotSupportedException

請參閱API doc: Object#clone()

要解決這個問題,您需要使用try/catch塊來處理它,或者通過添加throws子句來重新定義它。

更新:

在說明中,我們被告知該方法不會拋出CloneNotSupportedException異常,並且還會詢問它為什么會這樣。

IMO -

  1. 您正在覆蓋超類中的方法。 只有返回類型,方法名稱和參數類型才被視為方法簽名。 因此,在覆蓋方法時,即使超類中的方法具有它,也可以省略子類中的throws子句。
  2. 每當你的類實現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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM