2011-12-22 69 views
3

宿題の一環として、cloneメソッドを持つ抽象クラスを実装するように求められます。関数のフレームが与えられます。JavaでCloneNotSupportedException例外をスローせずにクローン関数を作成

/** 
* @effects Creates and returns a copy of this. 
*/ 
public Object clone() { 
    // TODO: Implement this method 


} 

Shapeクラスには次の2つのフィールドがあります:私たちはメソッドがCloneNotSupportedException例外をスローしないことを告げているの指示で

private Point location; 
private Color color; 

を、またありますなぜそれがそうであるか尋ねた。私たちがインターネット上で見たすべての例では、クローンメソッドはCloneNotSupportedExceptionを投げます。

このクローンメソッドがその例外をスローしてはならない理由を教えてください。

我々が書かれている方法は次のとおりです。

Unhandled exception type CloneNotSupportedExceptionを、どのように我々はcloneメソッドを作成する必要があります。

/** 
* @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()一部にエラーを与えますか?

+0

私は自分の答えを更新しました。それがあなたを助けることを願っています –

答えて

8

未処理の例外型CloneNotSupportedException

protected Object clone() throws CloneNotSupportedException 

APIドキュメントを参照してください。それを克服するためにObject#clone()

を、あなたはtry/catch blを使ってそれを処理する必要がありますそれを修正するにはthrows節を追加してください。

アップデート:私たちはメソッドはCloneNotSupportedException例外をスローしません、それがそうである理由も聞かれていることを告げているの指示で

IMO

-

  1. あなたは、スーパークラスのメソッドをオーバーライドしています。戻り値の型、メソッド名、およびパラメータ型のみがメソッドシグニチャと見なされます。そのため、メソッドをオーバーライドしている間は、スーパークラスのメソッドにそれがある場合でも、サブクラス内のthrows節を省略できます。
  2. あなたのクラスがCloneableインターフェイスを実装するときはいつでも、それはObjectクラスにクローンを作ることができるということを伝えています。このような場合、cloneメソッドを正しく実装するには、super.cloneメソッドを呼び出す必要があります。さて、実際にコピーを作成するのは、Objectクラスのcloneメソッドであることがわかります。だから、CloneNotSupportedExceptionを投げるには、Object.clone()に任せるべきです。また、階層内のいずれかのクラスがCloneableインターフェイスを実装していない場合、そうするでしょう。

私はそれが合理的であることを望む。

あなたはそれについてもっと読んでみたい場合に備えて、広大なものですが。それはEffective Java - Item 10: Override clone judiciouslyで説明されています。

7

クラスにはClonableインターフェイスを実装する必要があります。

また、ObjectではなくShape/Pointを返すためにCovariant Return Typesを使用することもできます。これは、不要な型キャストを避けるのに役立ちます。 Objectclone()方法がCloneNotSupportedExceptionをスローするように定義されているためです

2

他の実装がCloneNotSupportedExceptionをスローする理由は、それが既存のclone() method of Objectの一部であるということです。メソッドが例外をスローするように定義されているからといって、そうする必要はありません。 Shoneクラスとその派生クラスに対してclone()メソッドを実装するときは、例外をスローしないでください。

(Shape)super.clone()が例外をスローする理由は、これがデフォルト動作であるためです。 Shapeにclone()を実装します。