0

Joshua Bloch の『Effective Java』を読んでいます。濃密で複雑な本だと言わざるを得ません。すべてのオブジェクトに共通のメソッドに関する章 (第 3 章) は、私がプログラミングを始めて 3 年未満 (Java で 1 年) しか経っていないため、理解するのが難しいことがわかっています。clone メソッドを適切にオーバーライドするという概念がよくわかりません。正しい方法と間違った方法でクローンを実装する簡単な例を入手できますか? また、super.clone の呼び出しに失敗すると問題が発生するのはなぜでしょうか? 何が起こるか?

前もって感謝します。

4

2 に答える 2

1

私はその本を自分で読んでいます。この例ですべてが「正しく」行われたかどうかはわかりませんが、理解に役立つかもしれません。

コンピューター.java

package testclone;

public class Computer implements Cloneable {
    String OperatingSystem;

    protected Computer Clone() throws CloneNotSupportedException {
        Computer newClone = (Computer) super.clone();
        newClone.OperatingSystem = this.OperatingSystem;
        return newClone;
    }

}

マルチコア.java

package testclone;

public class MultiCore extends Computer implements Cloneable {
    int NumberOfCores;

    @Override
    protected MultiCore Clone() throws CloneNotSupportedException {
     //*********  use 1 of the next 2 lines  ***********           
        //MultiCore newClone = (MultiCore) super.clone();
        MultiCore newClone = new MultiCore();
        newClone.NumberOfCores = this.NumberOfCores;
        return newClone;
    }
}

TestClone.java

package testclone;

public class TestClone implements Cloneable {

    public static void main(String[] args) throws CloneNotSupportedException {
        //Computer myComputer = new Computer();
        //myComputer.OperatingSystem = "Windows";

        MultiCore myMultiCore = new MultiCore();
        myMultiCore.OperatingSystem = "Windows";    //field is in parent class
        myMultiCore.NumberOfCores = 4;

        MultiCore newMultiCore = myMultiCore.Clone();

        System.out.println("orig Operating System  = " + myMultiCore.OperatingSystem);
        System.out.println("orig Number of Cores   = " + myMultiCore.NumberOfCores);
        System.out.println("clone Operating System = " + newMultiCore.OperatingSystem);
        System.out.println("clone Number of Cores  = " + newMultiCore.NumberOfCores);

    }

}

出力:

元のオペレーティング システム = Windows

元のコア数 = 4

clone Operating System = null * この行は必要なものではありません。

clone コア数 = 4

代わりに super.clone() 行を使用すると、出力は

元のオペレーティング システム = Windows

元のコア数 = 4

clone オペレーティング システム = Windows * 今、あなたが望むものです

clone コア数 = 4

したがって、super.clone() を使用しない場合、親 (または祖父母、曽祖父母など) のフィールドは複製されません。

幸運を!(申し訳ありませんが、入力したときは正しくフォーマットされているように見えましたが、実際に表示すると何らかの理由でひどく見えます)

于 2014-05-14T03:44:54.463 に答える