java 类的合成_如何将Java中的克隆合成基础对象类

博客探讨了在Java中进行深层复制合成对象时遇到的问题。深度阅读和温度阅读类的clone方法简单地调用super.clone(),而海洋阅读类需要在clone方法中递归地克隆其内部的对象。这个过程需要对所有相关类的代码有深入理解以确保正确复制。博客强调了在实现深层复制时对句柄进行克隆的重要性,以及如何在子类中适当地造型和调用clone方法。
摘要由CSDN通过智能技术生成

试图深层复制合成对象时会遇到一个问题。必须假定成员对象中的clone()方法也能依次对自己的句柄进行深层复制,以此类推。这使我们的操作变得复杂。为了能正常实现深层复制,必须对所有类中的代码进行控制,或者至少全面掌握深层复制中需要涉及的类,确保它们自己的深层复制能正确进行。

b534162171f0b52e8b80496c52d4528b.png

下面这个例子总结了面对一个合成对象进行深层复制时需要做哪些事情:

//: DeepCopy.java

// Cloning a composed object

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();

}

// Must clone handles:

o.depth = (DepthReading)o.depth.clone();

o.temperature =

(TemperatureReading)o.temperature.clone();

return o; // Upcasts back to Object

}

}

public class DeepCopy {

public static void main(String[] args) {

OceanReading reading =

new OceanReading(33.9, 100.5);

// Now clone it:

OceanReading r =

(OceanReading)reading.clone();

}

} ///:~

DepthReading和TemperatureReading非常相似;它们都只包含了基本数据类型。所以clone()方法能够非常简单:调用super.clone()并返回结果即可。注意两个类使用的clone()代码是完全一致的。

OceanReading是由DepthReading和TemperatureReading对象合并而成的。为了对其进行深层复制,clone()必须同时克隆OceanReading内的句柄。为达到这个目标,super.clone()的结果必须造型成一个OceanReading对象(以便访问depth和temperature句柄)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值