曾几何时有一堂课:
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
我认为目前的绿色答案很糟糕,为什么你会问?
哦顺便说一下序列化也很糟糕,你可能不得不在整个地方添加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/查看
这也是没人喜欢的Cloneable原因之一。它应该是一个标记接口,但它基本上没有用,因为你无法在Cloneable没有反射的情况下克隆任意对象。
几乎唯一的方法是使用公共 方法创建您自己的接口clone()(不必称为“ clone()”)。这是另一个 StackOverflow 问题的示例。
| 归档时间: |
|
| 查看次数: |
17460 次 |
| 最近记录: |