所以我理解在实现clone()
方法时,应该首先调用super.clone()
,这样(潜在的(超级类就可以完成它的任务,然后进行自己的克隆。这一切都确保了没有来自超类的变量被列出/克隆。
现在,如果我使用Jacksons ObjectMapper进行克隆:return objectMapper.readValue(objectMapper.writeValueAsString(this), Mail.class);
我决定这样做,因为我的对象(Mail
(已经可以完全转换为json和json,不管怎样,json基本上就是克隆
在这种情况下,调用super.clone((是没有用的,对吗?Jackson无论如何都会复制超级变量,当它以这种方式设置时,super.clone()
的结果不会起任何作用。
我是不是错过了什么?
问候,
Chris
在这种情况下,调用super.clone((是无用的,对吧?
不安静。Jackson
将在后台执行所有操作以正确实例化对象,但仅基于公共字段或您已配置为可序列化为JSON的字段有关专用字段的信息将丢失。
class A {
public int x = 10;
private int y = 100; // this info will be lost when cloning with Jackson
}
虽然这种方法在小项目上完全可行。我认为,如果你把它作为一个大的克隆方法,它会产生太多的开销。过多的去变现和串行化可能会变得昂贵。
您应该考虑使用代理模式在java中实现克隆。这也会有所帮助。
clone
方法和Jackson没有任何关系。因此,您甚至不需要实现clone
方法。
序列化和反序列化对象一直是复制对象的常用方法。请记住,它也有缺点。