Java中如何使用super.clone()确保深拷贝实现遵循正确的克隆链?
- 内容介绍
- 文章标签
- 相关推荐
本文共计1170个文字,预计阅读时间需要5分钟。
java默认的clone()方法仅做浅拷贝:
常见错误现象:CloneNotSupportedException 没抛出,程序也不报错,但业务逻辑出 bug —— 比如两个“独立”的配置实例共享同一个 Map,改一个,另一个也变了。
- 必须确保当前类实现
Cloneable接口(否则super.clone()抛CloneNotSupportedException) -
clone()方法必须声明为public,因为Object.clone()是protected - 不能依赖
super.clone()自动处理嵌套对象,那是你自己的责任
如何在 clone() 中安全调用 super.clone() 并补全深拷贝
正确做法是:先调用 super.clone() 得到浅拷贝实例,再对每个可变引用字段手动克隆或重建。关键在于“谁负责克隆谁”——只有你自己最清楚哪些字段需要深拷,哪些可以共享(比如 String 是不可变的,无需克隆)。
本文共计1170个文字,预计阅读时间需要5分钟。
java默认的clone()方法仅做浅拷贝:
常见错误现象:CloneNotSupportedException 没抛出,程序也不报错,但业务逻辑出 bug —— 比如两个“独立”的配置实例共享同一个 Map,改一个,另一个也变了。
- 必须确保当前类实现
Cloneable接口(否则super.clone()抛CloneNotSupportedException) -
clone()方法必须声明为public,因为Object.clone()是protected - 不能依赖
super.clone()自动处理嵌套对象,那是你自己的责任
如何在 clone() 中安全调用 super.clone() 并补全深拷贝
正确做法是:先调用 super.clone() 得到浅拷贝实例,再对每个可变引用字段手动克隆或重建。关键在于“谁负责克隆谁”——只有你自己最清楚哪些字段需要深拷,哪些可以共享(比如 String 是不可变的,无需克隆)。

