Dart如何实现对象拷贝且不产生引用关联
问题原因
你当前的写法属于引用赋值,仅拷贝了item1的内存地址赋值给item2,两个变量实际指向堆内存中的同一个对象实例,因此修改任意一个的属性都会同步影响另一个。
要实现两个完全无关联的独立对象,需要做对象拷贝,根据对象结构可选以下两类方案:
方案1:浅拷贝
仅拷贝对象的第一层属性,仅适用于Item类的所有属性都是基础数据类型(无嵌套对象、数组、集合等引用类型属性)的场景:
- Java 实现:让
Item类实现Cloneable接口,重写clone()方法,调用时写为:Item item2 = item1.clone(); - JavaScript 实现:可以用展开语法或
Object.assign:// 展开语法 const item2 = {...item1} // Object.assign 写法 const item2 = Object.assign({}, item1) - Python 实现:调用
copy模块的浅拷贝方法:import copy item2 = copy.copy(item1)
方案2:深拷贝
会递归拷贝对象所有层级的属性,包括嵌套的引用类型属性,拷贝后的两个对象完全无关联,适用于所有场景:
- Java 实现:可通过序列化/反序列化实现,比如将对象写入字节流后再读取生成新实例,也可以手动递归拷贝所有嵌套属性
- JavaScript 实现:无特殊属性(函数、Symbol、循环引用)的场景可以直接用JSON序列化反序列化:
有特殊属性的场景可以自己实现递归拷贝逻辑即可const item2 = JSON.parse(JSON.stringify(item1)) - Python 实现:调用
copy模块的深拷贝方法:import copy item2 = copy.deepcopy(item1)
内容的提问来源于stack exchange,提问作者Mohammad Alamoudi
相关产品推荐
相关产品推荐

