有关Cloneable接口和应抛出的异常的问题

时间:2010-05-22 15:46:53

标签: java exception interface clone cloneable

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接口已经坏了,但我真的不知道这意味着什么。我错过了什么吗?

3 个答案:

答案 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(); }