我必须克隆一个没有实现Cloneable接口的对象如何做到这一点。
实际上在我的项目中,我正在使用JCChart。现在我的类扩展了MultiChart,我必须让我的班级深刻的副本。我能够克隆我的类对象,但如何克隆MultiChart的对象。就像我还必须克隆对象的传说,对象的页脚,对象的标题。
答案 0 :(得分:4)
如果您的课程为Serializable
而不是serialize the object to ByteStream和Deserialize that stream to a new object。
答案 1 :(得分:2)
您写道:
我必须克隆一个没有实现
Cloneable
接口的对象如何执行此操作。
克隆工作的要求是该类在您要调用它的上下文中提供可见的clone()
方法。该课程不会have to
实施Cloneable
。它可以实现clone()
方法以显式使用new
,然后通过构造函数和setter调用初始化新对象。 (Cloneable
接口是一个“标志”接口,它启用java.lang.Object.clone()
方法实现的默认浅层克隆机制。)
关于不使用克隆进行克隆的主题,替代方案包括:
这些方法都有局限性;例如适当的构造函数,getter,setter或可序列化的可用性。使用前两种方法实现深度克隆可能非常密集。最后一种方法往往要贵得多,但它是一种最简单的方法,可以为您提供复杂数据结构的深层复制......如果这就是您所需要的。
...但我在applet中执行此操作,因此无法通过限制applet来序列化对象以访问文件系统。
Java对象序列化(使用ObjectOutputStream
和ObjectInputStream
)和XStream都可以将对象写入由内存缓冲区支持的流;例如ByteArrayOutputStream
。这样就无需访问文件系统......并且速度更快。
答案 2 :(得分:0)
好吧,另一种方法是提供一个拷贝构造函数,老实说,考虑到Java克隆实现的语言特性,我倾向于选择这个选项。
复制构造函数由一个构造函数组成,该构造函数接收另一个相同类型的实例作为单个参数。然后你逐场进行相应的复制。
当你做这种事情时,你必须考虑到不变性以避免问题。
另一种方法是序列化你的对象,然后反序列化它,但这意味着你需要实现Serializable,这并不总是一个选项,它并没有任何影响。