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

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




Hiroshi Kunoさんの<3590E29A.380BD96F@xxxxxxxxxx>から

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

そういえば、clone() は複製のインスタンスを返すだけで、
初期化するわけではないと JDK のヘルプに書いてありました。

>コピーコンストラクタから close()を作ることはできますが、
>その逆は無理です。
>
>class A { // C++ のコードです
>public:
>    A();
>    A(A& a);
>    A* clone() { return new A(*this); }
>};

>C++的なコピーコンストラクタが欲しければ自前で書く必要があると思います。

やはり自前で書くのですね。
コピーコンストラクターが必要な設計というのがそもそもJava的ではない
のかなあという気がして来ました。

>しかしながら、JavaではC++のデフォルトコピーコンストラクタが無いために
>メンバ毎のコピーをすべてコーディング(clone()の呼び出しを列記)しなけれ
>ばならず、面倒です。

逆にC++にはなぜデフォルトコンストラクターがあるのか、という問いが浮かびますが、
なかったらたしかに面倒ですね。

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

それはそうですね。

>clone()メソッドは class Object で用意されています。
>Object.clone()は、そのインスタンスのクラスがCloneable をインプリメント
>していなければ、例外(CloneNotSupportedException)を発生し、インプリメント
>していればそのインスタンスの「浅いコピー」を実行するという仕掛けです。

「浅いコピー」とは、たとえば別のオブジェクトをメンバーに持つクラス
の場合、そのメンバー・オブジェクトは clone() の対象にならない
(個別に clone() で複製してやらないといけない) というような理解
をしたのですが、

>「深いコピー」をしたければ、clone()を派生クラス側でオーバライドして、
>深いコピーのための処理を書く必要があります。

この「深いコピー」というのが、上に書いたようなメンバーごとの clone() 
といった意味でしょうか。

P.S.読み返してみて、同語反復しかしていないので自分でもあきれています。
---------------------------------------------------------------
           遠藤靖之 (えんどう やすゆき)
   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