我必须克隆没有实现Cloneable接口的对象如何执行此操作。如何创建未实现Cloneable的对象的克隆
其实在我的项目中我使用的是JCChart。现在我的课程扩展了MultiChart,并且我必须让我的课程得到深层次的复制。我能够克隆我的类对象,但如何克隆MultiChart的对象。像我也必须克隆对象的传说,对象的页脚,对象的标题。
我必须克隆没有实现Cloneable接口的对象如何执行此操作。如何创建未实现Cloneable的对象的克隆
其实在我的项目中我使用的是JCChart。现在我的课程扩展了MultiChart,并且我必须让我的课程得到深层次的复制。我能够克隆我的类对象,但如何克隆MultiChart的对象。像我也必须克隆对象的传说,对象的页脚,对象的标题。
如果你的班级是Serializable
比你可以serialize the object to ByteStream和Deserialize that stream to a new object。
我尝试这个,但给出异常 java.io.IOException:未能加载图像内容 我认为writeObject无法写入数据 –
@ user571616,如果您的objectmap中的任何类不是serialzable,它会抛出java.io.NotSerializableException异常。 (即,如果您的类A包含类B的对象& C;而A类实现Serializable&B不会,而序列化类A的对象将抛出此异常 - 说classB不可序列化) –
那么,一种替代方法是提供一个拷贝构造函数,老实说,鉴于Java的克隆实现的超常语言性质,我倾向于选择这个选项。
复制构造函数由一个构造函数组成,该构造函数接收单一参数的另一个相同类型的实例。然后你逐场去做相应的复制。
当你做这种事情时,你必须考虑到不变性以避免问题。
另一种方法是序列化你的对象,然后反序列化它,但这意味着你需要实现Serializable,这并不总是一个选项,它不是没有任何影响。
复杂实例的过多手动工作图表。序列化非常容易。可串行化接口仅用于默认序列化。还有其他可用的。 –
如果在编译时类类型未知,则复制构造函数不起作用。即,您不能使用复制构造函数来动态克隆对象。 –
您写道:
我要克隆的对象,没有实现
Cloneable
界面如何做到这一点。
的克隆工作的要求是类提供了一个clone()
方法是可见在你要调用它的上下文。该类不have to
实施Cloneable
。它可以实现clone()
方法来显式使用new
,然后通过构造函数和setter调用来初始化新对象。 (该Cloneable
接口是一个“标志”的界面,使由java.lang.Object.clone()
方法实现的默认浅克隆机构)
在克隆的主题不使用克隆,替代方案包括:
这些方法都有局限性;例如适当的构造函数,getter,setter或可串行化的可用性。使用前两种方法实现深度克隆可能非常密集。最后一种方法的成本往往要昂贵得多,但它是向您提供复杂数据结构的深层副本的最简单方法......如果这是您需要的。
...但我在applet中这样做,所以无法序列化对象,因为applet限制访问文件系统。
Java对象串行(使用ObjectOutputStream
和ObjectInputStream
)和XStream既可以写入对象由内存缓冲器备份流;例如ByteArrayOutputStream
。这避免了访问文件系统的需要......并且速度会更快。
当我使用ByteArrayOutputStream来进行序列化,那么在那个时候,它会给出下面的java.io.IOException:加载图像内容失败 我认为图像在序列化时没有加载,所以我应该怎么做 –
看看你是否可以使用[XStream](http://xstream.codehaus.org/)做你想做的事情。 –
但我在applet中这样做,所以无法序列化对象,因为applet限制访问文件系统 –
使您的对象实现Cloneable接口并实现自己的深层副本。 – Heisenbug