[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[jfriends] コピーコンストラクター




C++で言うコピーコンストラクターを書きたくて、こんなコードを書いていました。

public class ClassA {
  private int id;
  private String name = null;

  ClassA() {}

  ClassA(CassA instance_a) {
    this.id = instance_a.id;
    this.name = instance_a.name;
  }

  public int getID() { return id; }
  public void setID(int Value) { id = Value; }

  public String getName() { return name; }
  public void setName(String Value) { name = Value; }
}

public class ClassB extends ClassA {
  private String phone_number = null;

  ClassB() {}

  ClassB(ClassB instance_b) {
    super(instance_b);
    this.phone_number = instance_b.phone_number;
  }

  public String getPhoneNumber() { return phone_number; }
  public void setPhoneNumber(String Value) { phone_number = Value; }
}

ところが、コピーコンストラクターは書かずに、
java.lang.Object にある clone() を呼べば良いのではないかということに今日気付きました。

ここで疑問は次の通りです。

1. clone() は、C++ で言うコピーコンストラクターを書かないで済ませるために
   作られたものなのだろうか?

2.clone() は java.lang.Cloneable インターフェースを実装してる class だけに対して
  使用可能だが、JDK 1.1 のヘルプで java.lang.Object のところを読むと、
  java.lang.Object は Cloneable を実装していないようだがなぜか?
  (ヘルプに書いてないだけ?)

3.自分でコピーコンストラクターを書かずに、Cloneable を実装して clone() を使う
  危険性は?

4.clone() を使わずに、自分でコピーコンストラクターを書くメリットがあるか?

3は実験してみれば良いですね。clone() は OutOfMemoryError という例外を発生させる
ようですので、もしかしたら4にもメリットがあるのかも知れません。

皆さんはたぶん clone() をお使いだと思うのですが、
自前のコピーコンストラクターを書かれた方はおられますか?
---------------------------------------------------------------
           遠藤靖之 (えんどう やすゆき)
   E-mail: yasuyuki@xxxxxxxxxx
      URL: http://members.aol.com/Eyasuyuki/ (Java互助会ホームページ)
〒171-0022 豊島区南池袋 2-14-10 瀬川池袋ビル 3F
           (株)エムティシー 技術営業部
       TEL 03-5396-0521 / FAX 03-5396-0525