如何创建一个没有实现Cloneable的对象的克隆

时间:2011-05-14 03:21:27

标签: java applet clone jcchart

我必须克隆一个没有实现Cloneable接口的对象如何做到这一点。

实际上在我的项目中,我正在使用JCChart。现在我的类扩展了MultiChart,我必须让我的班级深刻的副本。我能够克隆我的类对象,但如何克隆MultiChart的对象。就像我还必须克隆对象的传说,对象的页脚,对象的标题。

3 个答案:

答案 0 :(得分:4)

如果您的课程为Serializable而不是serialize the object to ByteStreamDeserialize that stream to a new object

答案 1 :(得分:2)

您写道:

  

我必须克隆一个没有实现Cloneable接口的对象如何执行此操作。

克隆工作的要求是该类在您要调用它的上下文中提供可见clone()方法。该课程不会have to实施Cloneable。它可以实现clone()方法以显式使用new,然后通过构造函数和setter调用初始化新对象。 (Cloneable接口是一个“标志”接口,它启用java.lang.Object.clone()方法实现的默认浅层克隆机制。)


关于不使用克隆进行克隆的主题,替代方案包括:

  • 使用复制构造函数
  • 使用常规构造函数和一系列getter和setter调用,或
  • 通过序列化和反序列化对象。

这些方法都有局限性;例如适当的构造函数,getter,setter或可序列化的可用性。使用前两种方法实现深度克隆可能非常密集。最后一种方法往往要贵得多,但它是一种最简单的方法,可以为您提供复杂数据结构的深层复制......如果这就是您所需要的。

  

...但我在applet中执行此操作,因此无法通过限制applet来序列化对象以访问文件系统。

Java对象序列化(使用ObjectOutputStreamObjectInputStream)和XStream都可以将对象写入由内存缓冲区支持的流;例如ByteArrayOutputStream。这样就无需访问文件系统......并且速度更快。

答案 2 :(得分:0)

好吧,另一种方法是提供一个拷贝构造函数,老实说,考虑到Java克隆实现的语言特性,我倾向于选择这个选项。

复制构造函数由一个构造函数组成,该构造函数接收另一个相同类型的实例作为单个参数。然后你逐场进行相应的复制。

当你做这种事情时,你必须考虑到不变性以避免问题。

另一种方法是序列化你的对象,然后反序列化它,但这意味着你需要实现Serializable,这并不总是一个选项,它并没有任何影响。