我需要在我的一个没有超类的对象中实现深度克隆。
处理检查的最佳方式是什么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(使用前将#替换为@)