Kotlin列表添加元素时所有元素被覆盖为最新值问题求助
问题核心原因
你遇到的是典型的对象引用复用问题:
- 你整个代码流程中只调用了一次
EachDay(day="", todo="")构造方法,全程只创建了1个EachDay实例 - Kotlin中类属于引用类型,向可变列表添加对象时,添加的是对象的内存引用,而非对象的深拷贝
- 你后续所有对
eachDay.day、eachDay.todo的赋值,都是修改同一个内存地址里的属性值,三次add操作只是把同一个引用重复添加了三次 - 所以只要这个对象的属性被修改,列表里所有指向该地址的元素读取到的值都会同步更新,就出现了所有元素和最新值一致的现象
修复方案
方案1:每次添加前创建新的EachDay实例(最直接)
不要复用全局的eachDay变量,每次新增条目时单独构造实例:
data class EachDay(var day: String, var todo: String) data class Week(val list:MutableList<EachDay>) fun main() { val week:Week = Week(arrayListOf()) // 每次新增都创建新实例 week.list.add(EachDay(day="Saturday", todo="Shopping, Groceries")) println("Week$week") week.list.add(EachDay(day="Sunday", todo="Rest")) println("Week$week") week.list.add(EachDay(day="Monday", todo="Check emails, resume work")) println("Week$week") }
方案2:使用data class的copy方法生成新实例(适合需要复用旧属性的场景)
如果你需要基于已有实例修改部分属性,可调用data class自带的copy方法生成全新实例:
val baseDay = EachDay(day="", todo="") week.list.add(baseDay.copy(day="Saturday", todo="Shopping, Groceries")) week.list.add(baseDay.copy(day="Sunday", todo="Rest"))
方案3:将EachDay属性改为不可变val(推荐,从设计上规避问题)
data class默认推荐使用不可变属性,修改属性时必须生成新实例,从语法层面避免误修改复用对象的问题:
// 属性用val声明,初始化后无法修改,必须创建新实例才能更新值 data class EachDay(val day: String, val todo: String)
内容的提问来源于stack exchange,提问作者Meenohara
相关产品推荐
相关产品推荐

