【问题标题】:Overriding clone with and without Cloneable使用和不使用 Cloneable 覆盖克隆
【发布时间】:2011-12-08 00:10:00
【问题描述】:

我已经阅读了 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()代码?提前感谢您的任何澄清/意见。

【问题讨论】:

    标签: java object clone


    【解决方案1】:

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

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

    c) 好处很小——您不必手动编写复制构造函数。 因此,请谨慎使用 Cloneable。与您需要付出的努力相比,它并没有给您带来足够的好处。

    About Java cloneable

    【讨论】:

      【解决方案2】:

      这是contractual obligation

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

      虽然可能没有可以覆盖的方法,但您仍在实现您所属的接口。在这样做时,您承担了其后续合同附带的所有内容。它迫使您有意识地实现 clone() 方法,从而使行为显式化。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-25
        • 1970-01-01
        • 2011-01-20
        • 1970-01-01
        • 2016-03-26
        相关资源
        最近更新 更多