有关可克隆界面和应抛出的例外的问题
题
Java文档说:
一个类实现可键入的界面,以指示对object.clone()方法,该方法对于该方法进行现场视野副本是合法的。
在不实现可克隆接口的实例上调用对象的克隆方法会导致抛出的异常clonotsupportedException。
按照惯例,实现此接口的类应用公共方法覆盖对象。clone(受保护)。有关覆盖此方法的详细信息,请参见Object.Clone()。
请注意,此接口不包含克隆方法。因此,不可能仅仅通过实现该接口的事实来克隆一个对象。即使对克隆方法进行反思调用,也不能保证它会成功。
我有这个 UserProfile
班级:
public class UserProfile implements Cloneable {
private String name;
private int ssn;
private String address;
public UserProfile(String name, int ssn, String address) {
this.name = name;
this.ssn = ssn;
this.address = address;
}
public UserProfile(UserProfile user) {
this.name = user.getName();
this.ssn = user.getSSN();
this.address = user.getAddress();
}
// get methods here...
@Override
public UserProfile clone() {
return new UserProfile(this);
}
}
对于测试孔,我会这样做 main()
:
UserProfile up1 = new UserProfile("User", 123, "Street");
UserProfile up2 = up1.clone();
到目前为止,没有问题编译/运行。现在,根据我对文档的理解,删除 implements Cloneable
来自 UserProfile
上课应在 up1.clone()
打电话,但事实并非如此。
我在这里读到,可克隆的界面被打破了,但我真的不知道那是什么意思。我想念什么吗?
解决方案
现在,根据我对文档的理解,删除
implements Cloneable
来自UserProfile
上课应该投掷和例外up1.clone()
打电话,但事实并非如此。
只要您的班级仍然具有 clone()
方法,当您称之为时,当然不会抛出一个例外 - 它像其他任何方法一样起作用,没有涉及特殊的魔法。
实施 clone()
在班上 Object
是引发异常的原因,但是您已经推翻了该方法。
其他提示
这意味着,如果您实现可克隆并省略clone()方法,然后调用clone()方法,则将抛出一个例外。
编辑: :之前已经提到了大概10亿次,但是
不要使用克隆方法!
如果需要克隆功能,请改用复制构造函数。
该界面被称为损坏,因为它不强迫您实现clone()(应该)。
我同意这两个答案并添加一些东西:界面就像一个“标签”,可以说您的班级实现了clone()。当您不知道对象类型时,这在类似API的方法中很有用。那你可以写
if (myobj instanceof Cloneable) { dosmthng(); }