java: super.clone() 与 Jackon ObjectMapper

java: super.clone() with Jackon ObjectMapper

所以我理解在实施 clone() 方法时,您应该首先调用 super.clone() 以便(潜在的)超级 class 可以完成它的工作,然后进行您自己的克隆。这一切都确保来自 superclass 的变量没有被列出/没有被克隆。

现在如果我使用 Jacksons ObjectMapper 进行克隆会怎样:
return objectMapper.readValue(objectMapper.writeValueAsString(this), Mail.class);
我决定这样做,因为我的对象 (Mail) 已经完全可以与 json 相互转换,这基本上是克隆。
在这种情况下调用 super.clone() 是没用的吧?杰克逊无论如何都会在设置超级变量时复制它,所以 super.clone() 的结果不会做任何事情。

我是不是遗漏了什么?

问候,
克里斯

In this case calling super.clone() is useless right?

不安静。 Jackson 将在幕后做所有事情来正确实例化您的对象,但仅基于 public 字段或您配置为可序列化为 JSON。 有关私有字段的信息将丢失

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

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

你应该考虑使用 proxy pattern to implement cloning in java. This 也有帮助。

Java 的 clone 方法和 Jackson 没有任何关系。所以你甚至不需要实现 clone 方法。

序列化和反序列化对象一直是复制对象的常用方法。请记住,它也有缺点。