加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

对象Java的深层副本

发布时间:2020-12-14 19:34:18 所属栏目:Java 来源:网络整理
导读:我正在尝试克隆MyGraph的一个对象,我希望它是一个深层复制,因此对象内的arraylists也被克隆.现在我有: public static MyGraph deepCopy(MyGraph G){ MyGraph Copy = (MyGraph) G.clone(); Copy.VertexG = (ArrayListInteger) G.VertexG.clone(); Copy.EdgeG
我正在尝试克隆MyGraph的一个对象,我希望它是一个深层复制,因此对象内的arraylists也被克隆.现在我有:
public static MyGraph deepCopy(MyGraph G){
    MyGraph Copy = (MyGraph) G.clone();

    Copy.VertexG = (ArrayList<Integer>) G.VertexG.clone();
    Copy.EdgeG = (ArrayList<String>) G.EdgeG.clone();

    return Copy;
}

这会在尝试克隆arraylist时返回错误.我不确定这是否是将arraylists添加到对象的正确方法.

解决方法

ArrayList中的clone操作返回对象的浅表副本,并不适合您的目的.手动解决方法是:

>创建与源列表大小相同的目标阵列列表
>迭代源列表并将其每个项目的克隆创建到目标列表中

显然,这只有在数组列表包含实现clone的项目时才有效,此外,项目clone操作实际上返回一个深层副本.换句话说,它不能保证.实际上,为Java对象实现深度克隆功能并不容易,请参考Java: recommended solution for deep cloning/copying an instance和其他SO线程中的大量讨论,以了解可用的选项.除了那里提供的答案,这里还有一些其他选择:

序列化

如果层次结构中的所有(必需的)对象都可以序列化,那么您可以使用这个简单的代码进行深度克隆:

public MyGraph deepCopy() {
    try {
        final ByteArrayOutputStream baos = new ByteArrayOutputStream(256);
        final ObjectOutputStream oos = new ObjectOutputStream(baos);
        oos.writeObject(this);
        oos.close();

        final ObjectInputStream ois = new ObjectInputStream(
                new ByteArrayInputStream(baos.toByteArray()));
        final MyGraph clone = (QuicksortTest) ois.readObject();
        return clone;
    } catch (final Exception e) {
        throw new RuntimeException("Cloning failed");
    }
}

请注意,某些深度克隆库将标准Java序列化与反射黑客和/或字节代码检测相结合,以使整个对象层次结构完全可序列化.您可能需要也可能不需要.

复制工具

例如,Dozer,提供快速深层复制功能. Orika也可以实现相同的效果,尽管配置更多:

public MyGraph deepCopy() {
    final DozerBeanMapper mapper = new DozerBeanMapper();
    final QuicksortTest clone = mapper.map(this,MyGraph.class);
    return clone;
}

当然唯一的缺点是,您需要进入项目的额外依赖项.

在总切线上,您的deepCopy方法不应该是静态的.此外,您应该认真考虑通过将其设置为私有并实现getter / setter来封装对象的状态.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读