设为首页 加入收藏

TOP

Effective Java - 谨慎覆盖clone
2015-02-02 14:22:21 来源: 作者: 【 】 浏览:8
Tags:Effective Java 谨慎 覆盖 clone

覆盖clone时需要实现Cloneable接口,Cloneable并没有定义任何方法。
那Cloneable的意义是什么?
如果一个类实现了Clonable,Object的clone方法就可以返回该对象的逐域拷贝,否则会抛出CloneNotSupportedException


通常,实现接口是为了表明类的行为。
而Cloneable接口改变了超类中protected方法的行为。
这是种非典型用法,不值得仿效。



好了,既然覆盖了clone方法,我们需要遵守一些约定:


另外,我们必须保证clone结果不能影响原始对象的同时保证clone方法的约定。



比如下面这种情况,没有覆盖clone方法,直接得到super.clone()的结果:



结果可想而知,clone结果的elements和原始对象的elements引用同一个数组。


既然如此,覆盖clone方法,并保证不会伤害到原始对象:


虽然把elements单独拿出来clone了一遍,但这种做法的前提是elements不是final。
其实再正常不过,clone无法和引用可变对象的不可变field兼容。



如果数组的元素是引用类型,当某个元素发生改变时仍然会出现问题。
此处以Hashtable为例,Hashtable中的元素用其内部类Entry。



如果像Stack例子中那样直接对elements进行clone,某个Entry发生变化时clone出来的Hashtable也随之发生变化。


于是Hashtable中如此覆盖clone:



鉴于clone会导致诸多问题,有两点建议:


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Effective Java - 谨慎覆盖equals 下一篇Effective Java - 谨慎实现Compar..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: