Java:如何轻松地深度克隆复杂的对象层次结构?

标签 java clone

假设我有一个像这样的java对象(只是作为一个简单的例子)

 class Town{
     Public String name;
     Public Set<Business> Businesses;
     Public Set<Person> people; 
     Public Set<House> houses; 

     //... 
 }

房屋、人、企业等都是复杂的对象,这些对象又拥有自己的对象,这些对象又拥有自己的对象等 - 有些具有组合性,有些具有聚合类型关系。

现在,我需要向 Town 类添加一个 clone 方法,我有两个问题:

  • 如何克隆房屋集?我是否只需实现 House.clone() 并调用 houses.clone() 即可。 set会调用它每个成员的clone方法吗?

  • 假设这是一个不平凡的问题(房屋“有”10 组聚合复杂对象,每个房屋“有”10 组聚合复杂对象等等),是否有更好的方法来实现 Town 的克隆方法?

或者我是否只需要花时间在子对象和子子对象等上实现 100 个 .clone() 方法? (与在所有子对象上实现序列化并这样做相比,这会或多或少地工作吗?)

最佳答案

您有几个选择:

  1. 在所有类上实现克隆方法,以深度复制类及其所有实例变量(如果您不想依赖第三方框架,这有时很重要)
  2. 序列化对象(可以是文本文件或字符串)。您可以通过使用 Oracle 框架 Serialized 来完成此操作,该框架有一个实例 var,可以解码有关对象的信息。更多信息请点击:http://docs.oracle.com/javase/tutorial/jndi/objects/serial.html
  3. 这是一个可以对对象进行深层复制的第 3 方库:https://github.com/DozerMapper/dozer

有关深度复制库的更多信息:Java deep copy library

关于Java:如何轻松地深度克隆复杂的对象层次结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24432087/

相关文章:

java - 用于打开 Java 应用程序并插入文本的脚本

java - 一起使用@RequestBody 和@ModelAttribute?

java - 如何在Java程序中将列名转换为变量?

ruby - 复制 Ruby 字符串数组

git - 尽管有 svn copy,如何 git svn clone 完整的历史记录

struct - 如何克隆存储盒装特征对象的结构?

Java MongoDB 假装是复制从属

java - Android 应用程序架构——基于事件或分层

linux - linux 内核中的 clone() 系统调用定义在哪里?

java - 为什么我们在 Java 中使用 clone() 方法?