Tbpgr Blog

Ruby プログラマ tbpgr(てぃーびー) のブログ

書籍 Effective Java | cloneを注意してオーバーライドする

パンくず

Effective Java
cloneを注意してオーバーライドする

概要

cloneを注意してオーバーライドする

cloneとは

cloneメソッドをオーバーライドすることで、
クラスの複製が可能になります。
※ただし、シャローコピー(浅いコピー)です。

サンプルコード

package effective.creation.chapter3;

public class Sample11 {
  public static void main(String[] args) {
    Sample11Cloneable sample = new Sample11Cloneable();
    sample.setHoge("hoge");
    Sample11Hoge sampleHoge = new Sample11Hoge ();
    sampleHoge.setHoge("sampleHoge");
    sample.setSampleHoge(sampleHoge);
    System.out.println(sample.getHoge());
    System.out.println(sample.getSampleHoge().getHoge());
    Sample11Cloneable clone = sample.clone();
    System.out.println(clone.getHoge());
    System.out.println(clone.getSampleHoge().getHoge());

    sample.setHoge("hige");
    sampleHoge.setHoge("sampleHoge2");

    // hige
    System.out.println(sample.getHoge());
    // =>sampleHoge2変更された値
    System.out.println(sample.getSampleHoge().getHoge());
    // =>hoge Stringは不変なので影響を受けない
    System.out.println(clone.getHoge());
    // =>sampleHoge2 シャローコピーのため、sampleHogeの変更の影響を受ける
    System.out.println(clone.getSampleHoge().getHoge());
  }
}
package effective.creation.chapter3;

public class Sample11Cloneable implements Cloneable {
  String hoge;
  Sample11Hoge sampleHoge;

  public Sample11Hoge getSampleHoge() {
    return sampleHoge;
  }

  public void setSampleHoge(Sample11Hoge sampleHoge) {
    this.sampleHoge = sampleHoge;
  }

  public String getHoge() {
    return hoge;
  }

  public void setHoge(String hoge) {
    this.hoge = hoge;
  }

  @Override
  public Sample11Cloneable clone() {
    try {
      return (Sample11Cloneable) super.clone();
    } catch (CloneNotSupportedException e) {
      throw new AssertionError();// 発生しない
    }
  }
}

出力

hoge
sampleHoge
hoge
sampleHoge
hige
sampleHoge2
hoge
sampleHoge2