对象Java的深层副本
我正在尝试克隆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来封装对象的状态. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |