clone()

clone.png

clone()を使うときはどんなとき?

配列をコピーするとき

cloneよりコピーコンストラクタやコピーファクトリーが優れている理由

  • 誤りやすい言語外のオブジェクト生成の仕組みに依存しない
  • 強制できない上に適切に文書化されていない規則を、順守するように要求することがない。
  • finalのフィールドの適切な使われ方と相反することがない。
  • 不要なチェックされる例外を投げない
  • キャストを必要としない。
  • interfaceで宣言しても平気★

java.lang.Objectのclone()をオーバーライド

java.lang.Objectclone()という関数がある。

 protected  Object    clone();// このオブジェクトのコピーを作成して、返します。

すべてのオブジェクトはこのObjectクラスの派生、のはずなのに
普通に生活している限り、clone()メソッドは使えない。なんで???
これにはprotected修飾子がついているからだ

protectedがついているメソッドは、サブクラスでオーバーライドしてpublicにしてやらないと、外部から呼び出すことが出来ない。

clone()関数の書き方

  • clone()関数を書き加えるならば、そのクラスはCloneable を implement すること

cloneのテストコードの書き方

import com.example.miffy.sora.Vertex2D;
public void testClone() {
 Vertex2D p=new Vertex2D(0.2f,3.1f);
  Vertex2D cloned=p.clone();
  assertEquals(0.2f,cloned.x);
  assertEquals(3.1f,cloned.y);
  assertEquals("com.example.miffy.sora.Vertex2D",cloned.getClass().getName());
  //複製先は、別のオブジェクトでなければならない。
  assertTrue("複製先が別のオブジェクトになってません!",p!=cloned);
 }

サポートサイト Wikidot.com