【发布时间】:2011-02-22 17:47:55
【问题描述】:
Java 文档说:
一个类实现了 Cloneable 接口指示 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();
到目前为止,编译/运行没有问题。现在,根据我对文档的理解,从UserProfile 类中删除implements Cloneable 应该会在up1.clone() 调用中引发异常,但它不会。
我在这里读到过 Cloneable 界面已损坏,但我真的不知道这意味着什么。我错过了什么吗?
【问题讨论】:
-
Cloneable 是有问题的,因为 Cloneable 接口没有 clone() 方法,你要么需要知道实现 clone() 方法的特定类型(在这种情况下你是具体类型,所以你可以使用复制构造函数)或者你必须使用反射。任何需要反射才能正常工作的 API 都可能被描述为损坏。
-
注意:在clone方法中,不要调用构造函数,而是调用(UserProfile)super.clone()。见java.sun.com/javase/6/docs/api/java/lang/…“按惯例……”
标签: java exception interface clone cloneable