首页 / 知识
关于课程:如何在Java中制作对象的深层副本?
2023-04-15 10:19:00

How do you make a deep copy of an object in Java?在Java中,实现深层对象复制功能有点困难。 您采取什么步骤来确保原始对象和克隆对象没有引用? 一种安全的方法是序列化对象,然后反序列化。这样可以确保所有内容都是全新的参考。 这是有关如何有效执行此操作的文章。 注意事项:类可能会覆盖序列化,这样就不会创建新实例,例如单身人士。如果您的课程不是可序列化的,那么这当然也行不通。
少数人提到使用或覆盖 依赖序列化的方案(XML或其他)是不可靠的。
这里没有简单的答案。如果要深层复制对象,则必须遍历对象图并通过对象的复制构造函数或静态工厂方法显式复制每个子对象,而该方法又会深层复制子对象。不变项(例如 您可以通过序列化制作深层副本,而无需创建文件。
您要深度复制的对象需要为 将您的类转换为字节流:
从字节流中还原类:
您可以使用Apache Commons Lang中的 通常,最佳实践是为需要克隆的对象图中的对象的每个类编写自己的克隆方法。 实现深层复制的一种方法是将复制构造函数添加到每个关联的类。复制构造函数将'this'的实例作为其单个参数,并从中复制所有值。很多工作,但是非常简单和安全。 编辑:请注意,您不需要使用访问器方法来读取字段。您可以直接访问所有字段,因为源实例的类型始终与使用复制构造函数的实例相同。显而易见,但可能会被忽略。 例:
编辑:请注意,在使用复制构造函数时,您需要知道要复制的对象的运行时类型。使用上述方法,您无法轻松地复制混合列表(您可以使用一些反射代码来完成此操作)。 Apache Commons提供了一种快速克隆对象的快速方法。
您可以使用具有简单API的库,并使用反射执行相对较快的克隆(应该比序列化方法要快)。
XStream在这种情况下确实很有用。这是执行克隆的简单代码
一种非常简单的方法是使用Jackson JSON将复杂的Java Object序列化为JSON并读回。 http://wiki.fasterxml.com/JacksonInFiveMinutes
对于Spring Framework用户。 使用类
使用XStream(http://x-stream.github.io/)。您甚至可以通过注释或为XStream类显式指定属性名称来控制可以忽略哪些属性。而且,您不需要实现可克隆的接口。
对于复杂的对象,当性能不重要时,我使用json库,例如gson
在大多数情况下,基于反射的gson将起作用,除了
深层复制只能在每个班级的同意下进行。如果您可以控制类的层次结构,则可以实现可克隆的接口并实现Clone方法。否则,进行深拷贝将无法安全地进行,因为对象也可能共享非数据资源(例如数据库连接)。但是,总的来说,深度复制在Java环境中被认为是不好的做法,应通过适当的设计实践来避免这种情况。
我使用Dozer克隆Java对象,这很不错,Kryo库是另一个很好的选择。 1)
在这里,您的MyPerson和MyAddress类必须实现Serilazable接口 BeanUtils在深度克隆豆方面做得非常好。
|
最新内容
相关内容
linux无效对象的命令?
linux无效对象的命令?,软件,系统,单位,网络,管理,术语,检测,电脑,环境,风险,linux疑问:普通用户的ifconfig命令无法执行,如何解决?建议这个操linux输入命令的步骤?
linux输入命令的步骤?,系统,工作,命令,发行,第三,数字,时间,管理,首开,基础,linux中使用vi指令后怎么输入?[Ctrl]+[f]:屏幕向下移动一页,相当于[linux下载步骤命令?
linux下载步骤命令?,系统,软件,网络,电脑,官网,名称,管理,工具,位置,盘中,安装Linux系统的步骤是什么1、安装 Linux 的步骤如下:准备一个可启动pythonPandas Series对象有哪些属
pythonPandas Series对象有哪些属性?,工具,数据,数字,分析,培训,属性,数据类型,数组,对象,索引,想必大家都知道pandas,它是基于Numpy的一种工具python是面向对象还是面向过程的
python是面向对象还是面向过程的,数据,代码,基础,形态,培训,术语,设计,对象,过程,语言,Python虽然是解释型语言,但从设计之初就已经是一门面向实现Python对象的持久化存储
实现Python对象的持久化存储,数据,对象,系统,函数,培训,标准,环境,管理,参数,文件,Python中有个序列化过程叫作pickle,它能够实现任意对象与文python之访问对象的元数据
python之访问对象的元数据,数据,异常,培训,属性,模块,对象,类型,定义,文档,实例,当你对一个你构造的对象使用dir()时,可能会发现列表中的很多python之执行对象
python之执行对象,代码,数据,信息,概念,培训,通用,对象,属性,方法,赋值,有时候我们会碰到这样的需求,需要执行对象的某个方法,或是需要对对象的Python之数据库游标对象详解
Python之数据库游标对象详解,软件,代码,一致,培训,数据库,游标,对象,方法,事务,操作,常用数据库:MySQL、Oracle、SQLite但是包嵌入到Python中Python 中的一切皆对象
Python 中的一切皆对象,代码,数字,包装,培训,对象,函数,赋值,血统,字符串,变量,在Python中,OOP是完全不是必须的,在初学阶段也不需要使用类,利用Python类和对象
Python类和对象,代码,培训,对象,实例,定义,关键字,函数,问题,顶层,全名,刚接触python中的类和对象,我也和大多数小伙伴一样迷茫,不知道它和我所Python文件操作步骤示例
Python文件操作步骤示例,异常,代码,信息,文件,设计,简介,通用,意外,中级,培训,我们来读取这样一个文本文件:song.txt,该文件的字符编码为utf-8