用泛型克隆

Eta*_*tam 10 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;
   }
}
Run Code Online (Sandbox Code Playgroud)

在对象中我们有:

protected native Object clone() throws CloneNotSupportedException;
Run Code Online (Sandbox Code Playgroud)

而Cloneable接口是:

public interface Cloneable { 
}
Run Code Online (Sandbox Code Playgroud)

我应该如何克隆这个?

Coj*_*nes 10

我认为目前的绿色答案很糟糕,为什么你会问?

  • 它增加了很多代码
  • 它要求您列出要复制的所有字段并执行此操作
  • 当使用clone()时,这对于列表不起作用(这是HashMap的clone()所说的:返回此HashMap实例的浅表副本:键和值自身未被克隆.)所以你最终手动完成它(这使得我哭了)

哦顺便说一下序列化也很糟糕,你可能不得不在整个地方添加Serializable(这也让我哭).

那么解决方案是什么:

Java深度 克隆库克隆库是一个小型的开源(apache许可证)java库,它深入克隆对象.对象不必实现Cloneable接口.实际上,这个库可以克隆任何java对象.如果您不希望修改缓存对象或者只是想要创建对象的深层副本,则可以在缓存实现中使用它.

Cloner cloner=new Cloner();
XX clone = cloner.deepClone(someObjectOfTypeXX);
Run Code Online (Sandbox Code Playgroud)

请访问http://code.google.com/p/cloning/查看

  • 语义正确的克隆操作必须用该对象的副本替换用可复制对象的状态封装所有字段,但必须*不*使用封装对象的*identity*的字段(包含任何字段的对象)封装可变状态和目标身份都无法单独克隆;有可能克隆一组这样的对象,但正确这样做需要了解它们之间的关系).如果永远不会修改对象,那么该类型是否是不可变的,深度克隆...... (2认同)
  • ...将是浪费但(除非对象身份很重要)不会影响正确性.我不是很清楚了深刻的克隆实用程序是多么有用容易被一般的,除非它与该标签这就需要复印的领域类使用,因为需要深克隆领域的领域是如何使用的功能,并不是它的类型. (2认同)

Mic*_*ers 5

这也是没人喜欢的Cloneable原因之一。它应该是一个标记接口,但它基本上没有用,因为你无法在Cloneable没有反射的情况下克隆任意对象。

几乎唯一的方法是使用公共 方法创建您自己的接口clone()(不必称为“ clone()”)。这是另一个 StackOverflow 问题的示例。