【问题标题】:how to create clone of an object which does not implement Cloneable如何创建不实现 Cloneable 的对象的克隆
【发布时间】:2011-08-25 08:53:08
【问题描述】:

我必须克隆一个没有实现 Cloneable 接口的对象怎么做。

实际上,在我的项目中,我正在使用 JCChart。现在我的课程扩展了 MultiChart,我必须创建课程的深层副本。我能够克隆我的类对象,但如何克隆 MultiChart 的对象。就像我还必须克隆对象的图例、对象的页脚、对象的页眉。

【问题讨论】:

  • 看看你是否可以使用XStream来做你想做的事情。
  • 但我是在applet中执行此操作的,因此由于applet访问文件系统的限制,无法序列化对象
  • 让你的对象实现 Cloneable 接口并自己实现深拷贝。
  • 要进行深层复制,我必须创建我正在使用的图表图例的克隆 chartClone.setLegend(chart.getLegend().clone()) 但由于 JCLegend 没有实现 Cloneable 接口,这就是为什么我我变得无法克隆传说。我该怎么做
  • 您应该能够序列化为内存中的流,例如 ByteArrayOutputStream。

标签: java applet clone jcchart


【解决方案1】:

如果您的班级是Serializable,那么您可以使用serialize the object to ByteStreamDeserialize that stream to a new object

【讨论】:

  • 我试试这个但是给出异常 java.io.IOException: failed to load image contents 我认为 writeObject 无法写入数据
  • @user571616,如果您的 objectmap 中的任何类不可序列化,则会抛出 java.io.NotSerializableException 异常。 (即,如果您的 A 类包含 B 类和 C 类的对象;并且 A 类实现了 Serializable 而 B 没有,那么在序列化 A 类的对象时会抛出此异常 - 说 classB 不可序列化)
【解决方案2】:

你写道:

我必须克隆一个没有实现Cloneable接口的对象怎么做。

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


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

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

这些方法都有局限性;例如适当的构造函数、getter、setter 或可序列化的可用性。使用前两种方法实现深度克隆可能需要大量编码。最后一种方法的成本往往要高得多,但它是为您提供复杂数据结构的深层副本的最简单方法……如果您需要的话。

...但是我在小程序中执行此操作,因此由于限制小程序访问文件系统而无法序列化对象。

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

【讨论】:

  • 当我使用 ByteArrayOutputStream 进行序列化时,它会给出以下 java.io.IOException: failed to load image contents 我认为图像在序列化时没有加载,我应该怎么做这样做
【解决方案3】:

嗯,另一种选择是提供一个复制构造函数,老实说,考虑到 Java 的克隆实现的语言外特性,我倾向于这个选项。

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

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

另一种方法是序列化您的对象,然后对其进行反序列化,但这意味着您需要实现 Serializable,这并不总是一种选择,也不是没有某些含义。

【讨论】:

  • 复杂实例图的手动工作过多。序列化要容易得多。仅默认序列化需要可序列化接口。还有其他可用的。
  • 如果类类型在编译时未知,则复制构造函数不起作用。即,您不能使用复制构造函数来动态克隆对象。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-06
  • 2013-04-23
  • 1970-01-01
  • 2011-07-26
  • 2012-09-17
  • 1970-01-01
相关资源
最近更新 更多