Java文档说:
一个类实现了Cloneable 界面指示 它是Object.clone()方法 合法的方法来制作一个 字段的实地复制 那个班。
在一个上调用Object的clone方法 没有实现的实例 可克隆的界面导致了 异常CloneNotSupportedException 被抛出。
按惯例,实现的类 这个界面应该覆盖 Object.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);
}
}
为了测试porpuses,我在main()
:
UserProfile up1 = new UserProfile("User", 123, "Street");
UserProfile up2 = up1.clone();
到目前为止,编译/运行没有问题。现在,根据我对文档的理解,从implements Cloneable
类中删除UserProfile
应该在up1.clone()
调用中抛出异常,但事实并非如此。
我在这里读到Cloneable接口已经坏了,但我真的不知道这意味着什么。我错过了什么吗?
答案 0 :(得分:5)
现在,根据我对文档的理解,从
implements Cloneable
类中删除UserProfile
应该在up1.clone()
调用中抛出异常,但事实并非如此。
只要你的类仍然有clone()
方法的实现,当你调用它时,不会抛出异常 - 它就像任何其他方法一样,没有特殊的魔法。
类clone()
中Object
的实现是抛出异常的原因,但是您已经覆盖了该方法。
答案 1 :(得分:1)
这意味着如果你实现Cloneable并省略clone()方法并且THEN调用clone()方法,则会抛出异常。
编辑:之前已经提到了10亿次,但是
不要使用克隆方法!
如果您需要克隆功能,请改为提供复制构造函数。
该接口被称为已断开,因为它不会强制您实现clone()(它应该)。
答案 2 :(得分:1)
我同意这两个答案并添加一些东西:界面就像一个'标签',表示你的类实现了clone()。当您不知道对象类型时,这在api类方法中很有用。然后你可以写
if (myobj instanceof Cloneable) { dosmthng(); }