[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()を派生クラス側でオーバライドして、
深いコピーのための処理を書く必要があります。