2011-05-14 89 views
1

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

其实在我的项目中我使用的是JCChart。现在我的课程扩展了MultiChart,并且我必须让我的课程得到深层次的复制。我能够克隆我的类对象,但如何克隆MultiChart的对象。像我也必须克隆对象的传说,对象的页脚,对象的标题。

+0

看看你是否可以使用[XStream](http://xstream.codehaus.org/)做你想做的事情。 –

+0

但我在applet中这样做,所以无法序列化对象,因为applet限制访问文件系统 –

+0

使您的对象实现Cloneable接口并实现自己的深层副本。 – Heisenbug

回答

4

如果你的班级是Serializable比你可以serialize the object to ByteStreamDeserialize that stream to a new object

+0

我尝试这个,但给出异常 java.io.IOException:未能加载图像内容 我认为writeObject无法写入数据 –

+0

@ user571616,如果您的objectmap中的任何类不是serialzable,它会抛出java.io.NotSerializableException异常。 (即,如果您的类A包含类B的对象& C;而A类实现Serializable&B不会,而序列化类A的对象将抛出此异常 - 说classB不可序列化) –

0

那么,一种替代方法是提供一个拷贝构造函数,老实说,鉴于Java的克隆实现的超常语言性质,我倾向于选择这个选项。

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

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

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

+0

复杂实例的过多手动工作图表。序列化非常容易。可串行化接口仅用于默认序列化。还有其他可用的。 –

+0

如果在编译时类类型未知,则复制构造函数不起作用。即,您不能使用复制构造函数来动态克隆对象。 –

2

您写道:

我要克隆的对象,没有实现Cloneable界面如何做到这一点。

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


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

  • 使用一个拷贝构造函数,
  • 使用一个常规的构造函数和一系列的getter和setter调用,或者通过对对象进行序列化和反序列化来调用

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

...但我在applet中这样做,所以无法序列化对象,因为applet限制访问文件系统。

Java对象串行(使用ObjectOutputStreamObjectInputStream)和XStream既可以写入对象由内存缓冲器备份流;例如ByteArrayOutputStream。这避免了访问文件系统的需要......并且速度会更快。

+0

当我使用ByteArrayOutputStream来进行序列化,那么在那个时候,它会给出下面的java.io.IOException:加载图像内容失败 我认为图像在序列化时没有加载,所以我应该怎么做 –