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

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




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

違うのではないでしょうか。用途が重なる部分もありますが、
本質的には clone()とコピーコンストラクタでは目的が異なり
ますから。

close()はインスタンスの複製を作ることが目的ですが、
コピーコンストラクタは他のインスタンスの値をもらって
みずからを初期化することが目的です。
コピーコンストラクタから close()を作ることはできますが、
その逆は無理です。

class A { // C++ のコードです
public:
    A();
    A(A& a);
    A* clone() { return new A(*this); }
};

C++的なコピーコンストラクタが欲しければ自前で書く必要があると思います。
しかしながら、JavaではC++のデフォルトコピーコンストラクタが無いために
メンバ毎のコピーをすべてコーディング(clone()の呼び出しを列記)しなけれ
ばならず、面倒です。
 
#######
>   java.lang.Object は Cloneable を実装していないようだがなぜか?

実装していたら、Objectから派生するクラスはそれを継承して、
すべてのクラスがclone可能になってしまって、意味がありません。

clone()メソッドは class Object で用意されています。
Object.clone()は、そのインスタンスのクラスがCloneable をインプリメント
していなければ、例外(CloneNotSupportedException)を発生し、インプリメント
していればそのインスタンスの「浅いコピー」を実行するという仕掛けです。
「深いコピー」をしたければ、clone()を派生クラス側でオーバライドして、
深いコピーのための処理を書く必要があります。