深層複製合成物件時,必須假設成員物件的 clone() 也能正確深層複製其參考,以此類推。這要求對所有涉及類別的代碼有控制權,或至少完整掌握其深層複製正確性。
//: DeepCopy.java
class DepthReading implements Cloneable {
private double depth;
public DepthReading(double depth) { this.depth = depth; }
public Object clone() {
Object o = null;
try { o = super.clone(); }
catch (CloneNotSupportedException e) { e.printStackTrace(); }
return o;
}
}
class TemperatureReading implements Cloneable {
private long time;
private double temperature;
public TemperatureReading(double temperature) {
time = System.currentTimeMillis();
this.temperature = temperature;
}
public Object clone() {
Object o = null;
try { o = super.clone(); }
catch (CloneNotSupportedException e) { e.printStackTrace(); }
return o;
}
}
class OceanReading implements Cloneable {
private DepthReading depth;
private TemperatureReading temperature;
public OceanReading(double tdata, double ddata){
temperature = new TemperatureReading(tdata);
depth = new DepthReading(ddata);
}
public Object clone() {
OceanReading o = null;
try { o = (OceanReading)super.clone(); }
catch (CloneNotSupportedException e) { e.printStackTrace(); }
// 必須手動 clone 成員參考
o.depth = (DepthReading)o.depth.clone();
o.temperature = (TemperatureReading)o.temperature.clone();
return o;
}
}
public class DeepCopy {
public static void main(String[] args) {
OceanReading reading = new OceanReading(33.9, 100.5);
OceanReading r = (OceanReading)reading.clone();
}
} ///:~
DepthReading/TemperatureReading 僅含基本型別,clone() 極簡:super.clone() 即可。OceanReading 合成上述兩物件。深層複製時:
super.clone() 複製本身OceanReading 以存取成員參考clone()Object)此模式可遞迴應用於任意深度的物件圖。