我有一些不同的对象Gold
,Palladium
,Iron
等。这些对象实现了Cloneable
并且有一个名为Metal
的公共接口。
在课堂上我收到一个金属,可能是金钯等,需要克隆这个
Public doSomething(Metal receivedMetal){
Metal dolly=//clone receivedMetal
dolly.doOperation();
replaceMetal(receivedMetal, dolly);
//replace use an indexOf on receivedMetal
//and if I don't clone receivedMetal
//doOperation edit also the original
//receivedMetal and indexOf returns always -1
}
有没有办法克隆receivedMetal
对象?
答案 0 :(得分:0)
克隆可以通过创建一个构造函数来完成,该构造函数复制作为参数给出的对象中的所有字段。
public SomeObject(SomeObject o){
this.someField = o.getSomeField();
//etc..
}
- 编辑 -
您可以使用抽象类来定义您的克隆构造函数,而不是接口。那里。通过这种方式,您的子类可以覆盖它。
答案 1 :(得分:0)
如何在Metal
中扩展Cloneable并向其中添加clone()
?在下面的示例中,我看起来没问题(http://rextester.com/KCUGF81783):
import java.util.*;
import java.lang.*;
interface Metal extends Cloneable {
public Metal clone();
}
class Iron implements Metal {
public int val = 101;
public Iron clone() {
try {
return (Iron) super.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
throw new RuntimeException();
}
}
public String toString() { return "Iron " + val; }
}
class Rextester
{
public static void main(String args[])
{
Metal metal = new Iron();
Metal metal2 = metal.clone();
((Iron)metal).val = 200; // just to make sure metal2 is cloned
System.out.println(metal2); // outputs: Iron 101
}
}