首页 > 解决方案 > java: 带有 Jackon ObjectMapper 的 super.clone()

问题描述

所以我理解在实现该clone()方法时,您应该首先调用super.clone()以便(潜在的)超类可以做它的事情,然后进行自己的克隆。这一切都确保了超类中的变量不是列表/不克隆。

现在如果我使用 Jacksons ObjectMapper 进行克隆怎么办:我
return objectMapper.readValue(objectMapper.writeValueAsString(this), Mail.class);
决定这样做,因为我的对象( 在这种情况下调用 super.clone() 是没用的,对吧?无论如何,杰克逊都会在以这种方式设置超级变量时制作一个副本,因此结果不会做任何事情。Mail
super.clone()

我在这里错过了什么吗?

问候,
克里斯

标签: javajackson

解决方案


在这种情况下调用 super.clone() 是没用的,对吧?

不安静。Jackson将在幕后执行所有操作以正确实例化您的对象,但仅基于公共字段或您已配置为可序列化为 JSON 的字段。有关私有字段的信息将丢失

class A {
   public int x = 10;
   private int y = 100; // this info will be lost when cloning with Jackson
}

虽然这种方法非常适用于小型项目。我认为,如果将其用作大型克隆方法,则会产生太多开销。过多的去实体化和序列化会变得昂贵。

您应该考虑使用代理模式在 java 中实现克隆。也可以提供帮助。


推荐阅读