使用和不使用Cloneable覆盖克隆

时间:2011-10-14 18:57:42

标签: java object clone

我已经阅读了ObjectCloneable的javadoc,而我只是没有“得到”某些东西。有人可以向我解释以下两个例子的表现和/或功能差异:

public class Widget
{
    @Override
    public Widget clone()
    {
            // ... return a clone of this Widget
    }
}

..和

public class Widget implements Cloneable
{
    @Override
    public Widget clone()
    {
            // ... return a clone of this Widget
    }
}

由于Cloneable没有与之绑定的任何方法,并且只允许您访问Object的受保护的clone()方法,所以在第一时间实现它是否有意义,看到你将不得不以任何方式编写自己的(安全)clone()代码?提前感谢任何澄清/输入。

2 个答案:

答案 0 :(得分:5)

这是contractual obligation

  

在未实现的实例上调用Object的clone方法   Cloneable接口导致异常   抛出CloneNotSupportedException。

虽然可能没有方法可以覆盖,但您仍然在实现您所属的接口。在这样做的过程中,您将接受随后的合同所带来的一切。它强迫您有意识地实现clone()方法,从而使行为明确。

答案 1 :(得分:0)

a)克隆调用构造对象的超语言方式 - 没有构造函数。

b)克隆要求您以某种方式处理CloneNotSupportedException - 或者打扰客户端代码来处理它。

c)好处很小 - 您不必手动编写复制构造函数。 因此,请巧妙地使用Cloneable。与您需要申请做的事情相比,它没有给您带来足够的好处。

About Java cloneable