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

Java 如何正确重写克隆方法?

华萧迟
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吗?大多数人都同意Java clone是坏的。

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

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

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

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

重点是他的,而不是我的。

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



 类似资料:
  • 问题内容: 我需要在我的没有超类的对象中实现一个深层克隆。 处理超类(即Object)引发的检查的最佳方法是什么? 一位同事建议我按以下方式处理: 对于我来说,这似乎是一个不错的解决方案,但我想将其扔给StackOverflow社区,以查看是否有我可以提供的其他见解。谢谢! 问题答案: 您绝对必须使用吗?大多数人都同意是坏的。 Josh Bloch谈设计-复制构造函数与克隆 如果您已经阅读了我书中

  • 如果我克隆了以下类的一个实例,并在实例化时覆盖了一个方法,克隆会有被覆盖的方法吗?我在https://docs.oracle.com/javase/7/docs/api/java/lang/Cloneable.html和https://docs.oracle.com/javase/7/docs/api/java/lang/Object.html#clone()中没有找到任何关于这种行为的内容。

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

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

  • 我对在我想要克隆对象的类中重写克隆方法感到困惑。 因为Java中的每个类都是从Object扩展而来的,所以它应该有clone方法,但是我们仍然被迫重写clone。为什么要求? 另外,我在一些地方阅读了重写克隆对象并将其公之于众的内容。我想知道,为什么会这样? 欢迎提供所有答案。

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