知识卡片
final成员变量会阻断深拷贝实现
内容
[[浅拷贝与深拷贝的区别及String的特殊性]]提到的深拷贝实现——在clone()内对引用型成员 重新赋值为它自己clone的结果——若该成员被声明为final会编译报错,因为final字段只能赋值 一次。解决办法是要深拷贝就不能给该字段加final,两者不可兼得。发散:这暴露了Java里不 可变性(final)和可克隆性(clone)这两个语言特性之间的隐性冲突。
参考来源
- 位置:《设计模式之禅(第2版)》第13章《原型模式》(源文件:_epub-src/text/part0060.html)
- 结论依据:原文展示给ArrayList成员变量加final后,clone方法内`this.arrayList = (ArrayList)this.arrayList.clone()`这行代码编译报错,说明"你要实现深拷贝的梦想在final关键字的威胁下破灭了",解法是删除final关键字。
- 原始内容:粗体部分仅仅增加了一个final关键字,然后编译器就报斜体部分错误……你要实现深拷贝的梦想在final关键字的威胁下破灭了……你要使用clone方法,在类的成员变量上就不要增加final关键字。