パンくず
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