Jot*_*thi 137 java clone copy-constructor
克隆方法与java中的复制构造函数.哪一个是正确的解决方案.在哪里使用每个案例?
Tom*_*Tom 109
克隆破了,所以不要使用它.
Object类的CLONE方法是一种有点神奇的方法,它可以执行纯Java方法无法做到的事情:它生成对象的相同副本.自Java编译器*发布以来,它一直出现在原始的Object超类中; 它和所有古代魔法一样,需要适当的咒语来防止法术意外地逆火
首选复制对象的方法
Foo copyFoo (Foo foo){
Foo f = new Foo();
//for all properties in FOo
f.set(foo.get());
return f;
}
Run Code Online (Sandbox Code Playgroud)
阅读更多 http://adtmag.com/articles/2000/01/18/effective-javaeffective-cloning.aspx
Boz*_*zho 55
请记住,clone()开箱即用不起作用.您必须实现Cloneable并覆盖clone()制作的方法public.
有一些替代方案,这是更可取的(因为该clone()方法有很多设计问题,如其他答案中所述),并且复制构造函数需要手动工作:
BeanUtils.cloneBean(original)创建一个浅层克隆,就像创建一个Object.clone().(这个类来自commons-beanutils)
SerializationUtils.clone(original)创建一个深层克隆.(即整个属性图被克隆,不仅是第一级)(来自commons-lang),但所有类都必须实现Serializable
Java深度克隆库提供深度克隆而无需实现Serializable
Ros*_*one 32
clone()设计有几个错误(见这个问题),所以最好避免它.
从Effective Java 2nd Edition,第11项:明智地覆盖克隆
鉴于与Cloneable相关的所有问题,可以肯定地说其他接口不应该扩展它,并且为继承而设计的类(第17项)不应该实现它.由于它有许多缺点,一些专家程序员只是选择永远不要覆盖克隆方法,永远不要调用它,除非复制数组.如果您设计了一个继承类,请注意,如果您选择不提供行为良好的受保护克隆方法,则子类将无法实现Cloneable.
本书还介绍了复制构造函数相对于Cloneable/clone的许多优点.
所有标准集合都有拷贝构造函数.使用它们.
List<Double> original = // some list
List<Double> copy = new ArrayList<Double>(original);
Run Code Online (Sandbox Code Playgroud)
Ste*_*Kuo 18
请记住,复制构造函数将类类型限制为复制构造函数的类型.考虑这个例子:
// Need to clone person, which is type Person
Person clone = new Person(person);
Run Code Online (Sandbox Code Playgroud)
如果person可以是Person(或者如果Person是接口)的子类,则这不起作用.这是克隆的全部要点,它可以在运行时动态克隆正确的类型(假设克隆已正确实现).
Person clone = (Person)person.clone();
Run Code Online (Sandbox Code Playgroud)
要么
Person clone = (Person)SomeCloneUtil.clone(person); // See Bozho's answer
Run Code Online (Sandbox Code Playgroud)
现在person可以是正确实现的任何类型的Person假设clone.
| 归档时间: |
|
| 查看次数: |
162916 次 |
| 最近记录: |