[翻译+摘要]为何要用Copy constructor和不是Cloning 原文: https://www.artima.com/intv/bloch13.html
Cloneable 接口没有提供任何方法,基本上没有要求限制,也没有提供任何方法去copy。
- 最终都会叫Object的clone方法。无法对clone实现多态。
- Array of cloneable, 无法deep copy array。无法其他东西Cast成Cloneable然后叫clone方法,因为Cloneable和Object都没有公共的clone方法,cast的时候编译器会报错说你在叫Object中的protected clone方法。
Object clone Object clone方法很有陷阱,它是基于field copies,而且有“多余的语义”。它没有叫Constructor创建了Object。这导致Constructor创建的不变性失去了保证。这个问题导致出现很多问题,都终结于反复叫super.clone的chain, 会产生一个shallow copy of the object, clone的Object和原Object共享状态,如果状态是可修改的,其中一个修改会更改状态。
通常我会按照人们期望的那样,提供一个公共的clone方法在一个具体的class上。我不会有抽象类实现cloneable接口,也不会有接口继承clonebale,这样很麻烦
Doug Lea走的更远,他说他不用clone,除非是copy arrays,因为这是最快的方式。但是不要去实现cloneable接口。