如何正确重写克隆方法?

2024-01-25

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

处理检查的最佳方式是什么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 谈设计 - 复制构造函数与克隆 http://www.artima.com/intv/bloch13.html

如果你读过我书中有关克隆的内容,特别是如果你读到字里行间的内容,你就会知道我认为clone已深深破碎。 [...] 遗憾的是Cloneable坏了,但它发生了。

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

他接着写了一页又一页的内容来说明如果你觉得必须的话,你应该如何实施clone。但他最后这样说:

所有这些复杂性真的有必要吗?很少。如果你扩展一个实现了Cloneable,你别无选择,只能实施一个行为良好的clone方法。否则,您最好提供对象复制的替代方法,或者干脆不提供该功能.

重点是他的,不是我的。


既然你明确表示你别无选择,只能实施clone,在这种情况下您可以执行以下操作:确保MyObject extends java.lang.Object implements java.lang.Cloneable。如果是这样的话,那么你可以保证你会NEVER抓住一个CloneNotSupportedException。投掷AssertionError正如一些人所建议的似乎是合理的,但您也可以添加注释来解释为什么永远不会输入 catch 块在这种特殊情况下.


或者,正如其他人也建议的那样,您也许可以实施clone不打电话super.clone.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何正确重写克隆方法? 的相关文章

随机推荐