对象克隆
克隆可能很棘手,尤其是当对象的字段包含其他对象时。在某些情况下,你需要执行深层复制 ,而不是仅复制字段值(即对其他对象的引用)。
底线是克隆被破坏 ,你应该在实现 Cloneable
接口和覆盖 clone
方法之前三思而后行。clone
方法在 Object
类中声明,而不是在 Cloneable
接口中声明,因此 Cloneable
无法用作接口,因为它缺少公共 clone
方法。结果是使用 clone
的合同记录很少并且执行不力。例如,覆盖 clone
的类有时依赖于其所有父类也会覆盖 clone
。他们没有强制执行此操作,如果他们不这样做,你的代码可能会抛出异常。
提供克隆功能的更好解决方案是提供复制构造函数或复制工厂。请参阅 Joshua Bloch 的有效 Java 项目 11:明智地覆盖克隆。