当前位置: 首页 > 面试题库 >

如何正确覆盖克隆方法?

薛墨一
2023-03-14
问题内容

我需要在我的没有超类的对象中实现一个深层克隆。

处理CloneNotSupportedException超类(即Object)引发的检查的最佳方法是什么?

一位同事建议我按以下方式处理:

@Override
public MyObject clone()
{
    MyObject foo;
    try
    {
        foo = (MyObject) super.clone();
    }
    catch (CloneNotSupportedException e)
    {
        throw new Error();
    }

    // Deep clone member fields here

    return foo;
}

对于我来说,这似乎是一个不错的解决方案,但我想将其扔给StackOverflow社区,以查看是否有我可以提供的其他见解。谢谢!


问题答案:

您绝对必须使用clone吗?大多数人都同意Javaclone是坏的。

Josh Bloch谈设计-复制构造函数与克隆

如果您已经阅读了我书中有关克隆的文章,尤其是您在两行之间阅读的话,您会知道我认为它clone已经被深深地打断了。[…]这是一种耻辱Cloneable,但确实发生了。

您可以在他的有效Java第二版,第11项:clone明智地改写中阅读有关该主题的更多讨论。他建议改为使用复制构造函数或复制工厂。

他接着写了几页关于如何,如果您认为必须执行的书clone。但是他结束了:

所有这些复杂性真的必要吗?很少。如果扩展实现的类,Cloneable则别无选择,只能实现行为良好的clone方法。否则,最好提供对象复制的替代方法,或者根本不提供此功能。

重点是他而不是我的。

由于您已经清楚地表明除了执行之外别无选择clone,因此在这种情况下,您可以执行以下操作:确保MyObject extends java.lang.Object implements java.lang.Cloneable。如果是这种情况,那么您可以保证永远不会抓到CloneNotSupportedExceptionAssertionError如某些人建议的那样进行抛出似乎是合理的,但是您也可以添加一条注释,以解释为什么在这种特殊情况下永远不会输入catch块。

另外,正如其他人所建议的那样,您可以实现clone而无需调用super.clone



 类似资料:
  • 问题内容: 我需要在我的没有超类的对象中实现一个深层克隆。 处理超类(即)引发的检查的最佳方法是什么? 一位同事建议我按以下方式处理: 对我来说,这似乎是一个不错的解决方案,但我想将其扔给StackOverflow社区,以查看是否有我可以提供的其他见解。 问题答案: 你绝对必须使用吗?大多数人都同意是坏的。 如果你已经阅读了我书中有关克隆的内容,尤其是你在两行之间阅读的话,你会知道我认为它clon

  • 问题内容: 我有一个物体。我想将其复制为对象,这样更改就不会修改。我意识到,复制从内置JavaScript对象派生的对象将导致额外的不需要的属性。这不是问题,因为我正在复制自己的文字构造对象之一。 如何正确克隆JavaScript对象? 问题答案: 在JavaScript中对任何对象执行此操作都不是简单或直接的。您将遇到错误地从对象的原型中获取应该留在原型中而不应复制到新实例的属性的问题。例如,如

  • 问题内容: 对于在要克隆对象的类中重写克隆方法,我感到困惑。 对象类具有 受保护的对象 方法,并且按照受保护的行为,即 当方法受到保护时,只能由类本身,该类的子类或与该类位于同一包中的类访问 。 由于Java中的每个类都从Object扩展而来,因此它应该具有clone方法,但仍然被迫重写clone。为什么需要它? 另外,我在某些地方已经阅读了有关覆盖克隆对象并将其公开的信息。我不知道为什么会这样吗

  • 克隆当前板 采取行动 查看移动玩家是否处于检查中 如有,则不允许移动;否则,允许移动 我从这里获得关于如何克隆的提示: 现在,board对象由一个2D方形对象数组组成。每个方形对象都有一个piece字段,该字段要么为null(上面没有piece),要么引用一个piece对象(上面有一个piece)。board对象还有一个whiteKingSquare和一个blackKingSquare(都是方形对

  • 问题内容: 我需要方法方面的帮助,这非常令人讨厌。我尝试在线查找,因为那是一个正在搞砸的地方,即使在那里,它也“找不到2号Kid构造函数”,我什至会做其他事情,但它不起作用。好了,所以这是我的代码: 好的,所以我上面的toString(我知道,我的第三个参数已关闭,应该是String)已关闭。如果我在第三件事中硬编码一个值,它就会变成麻烦,并说找不到它(上面)。那么如何获取日期并将其拆分呢? 调用

  • 我正在使用PDFBoxV2,我正在尝试克隆PDDocument的第一个PDPage,以保留它作为新PDPages的模板。第一页,有一些顶形字段,我需要填充。 我尝试了一些方法,但任何人都让我想要实现。 谢谢!