java - 用泛型克隆

标签 java clone

从前有一个类:

public class Scope<C extends Cloneable & Comparable<C>> implements Comparable<Scope<C>>, Cloneable, Serializable {

   private C starts;
   private C ends;
   ...

   @SuppressWarnings("unchecked")
   @Override
   public Object clone() {
       Scope<C> scope;
       try {
           scope = (Scope<C>) super.clone();
           scope.setStarts((C) starts.clone()); // The method clone() from the type Object is not visible
           scope.setEnds((C) ends.clone()); // The method clone() from the type Object is not visible
       } catch (CloneNotSupportedException e) {
           throw new RuntimeException("Clone not supported");
       }
       return scope;
   }
}

在对象中我们有:

protected native Object clone() throws CloneNotSupportedException;

Cloneable接口(interface)是:

public interface Cloneable { 
}

我应该如何克隆它?

最佳答案

解决方案

使用 Java Deep-Cloning图书馆。

克隆库 是一个小型的开源(apache 许可证)java 库,可深度克隆对象。这些对象不必实现 Cloneable 接口(interface)。实际上,这个库可以克隆任何 java 对象。如果您不想修改缓存的对象,或者您想要创建对象的深拷贝,它可以在缓存实现中使用。

Cloner cloner=new Cloner();
XX clone = cloner.deepClone(someObjectOfTypeXX);

附录

以前的答案有以下缺点:

  • 它增加了很多代码
  • 它要求您列出要复制的所有字段并执行此操作
  • 这在使用 clone() 时不适用于列表; HashMapclone() 注意:返回此 HashMap 实例的浅拷贝:键和值本身未被克隆,所以您最终需要手动完成。

序列化也很糟糕,因为它可能需要在任何地方添加 Serializable

关于java - 用泛型克隆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/803971/

相关文章:

Java异步问题

java - 通用通配符协方差和数组列表添加函数行为

postgresql - 亚马逊极光 PostgreSQL : clone capability: down sides?

C fork - 如何在开始工作负载之前等待所有子进程?

javascript - jQuery clone() 多个列表并将每个列表附加到其原始列表

mercurial - 克隆、拉取 Mercurial 存储库时出现 404 错误

multithreading - 克隆和移动特征

java - 没有 client_secret 的 Spring Security OAuth 2.0

java - 如何在Play项目中添加Play Ebean?

java - 使用 Junit 生成多个单元测试