Kotlin数据类copy函数未正确修改实例属性问题求助
Kotlin数据类copy函数未正确修改实例属性问题求助
嘿,我来帮你揪出问题所在~
你遇到的核心问题是Kotlin数据类的copy()函数不会修改原对象,而是返回一个全新的实例,但你在代码里只是调用了copy()却没有把返回的新实例赋值给newModel变量,所以原来的newModel始终是你初始化时的状态(name和summary为空字符串)。
问题代码分析
看你这段代码:
private fun useCopyFunction(title: String = "xyz", list: List<MovieItemModel>) { val newModel = NewModel(title = title) list.firstOrNull { it.icon != "text" }?.let { item -> println("item found :- $item") val name = item.name val summary = item.summary // 这里调用了copy,但没有把返回的新实例存下来! newModel.copy( name = name, summary = summary ) } println("new model $newModel") }
你创建的newModel是val类型的不可变变量,调用copy()后会生成一个包含新属性值的NewModel实例,但这个新实例没有被赋值给任何变量,所以原newModel完全没变化,打印出来自然还是初始的空值。
修正方案
有两种常见的解决方式,根据你的需求选就行:
方式1:将newModel改为可变变量,接收copy()返回的新实例
private fun useCopyFunction(title: String = "xyz", list: List<MovieItemModel>) { // 把val改成var,允许重新赋值 var newModel = NewModel(title = title) list.firstOrNull { it.icon != "text" }?.let { item -> println("item found :- $item") // 将copy返回的新实例赋值给newModel newModel = newModel.copy( name = item.name, summary = item.summary ) } println("new model $newModel") }
方式2:直接通过let/?:初始化newModel,避免可变变量
如果不想用可变变量,可以更简洁地直接生成最终的newModel:
private fun useCopyFunction(title: String = "xyz", list: List<MovieItemModel>) { val newModel = list.firstOrNull { it.icon != "text" }?.let { item -> println("item found :- $item") // 直接创建包含目标属性的NewModel实例 NewModel( title = title, name = item.name, summary = item.summary ) } ?: NewModel(title = title) // 如果没找到符合条件的元素,用初始值 println("new model $newModel") }
补充说明
Kotlin数据类的设计初衷就是支持不可变数据模式,所以它的属性默认是val,copy()函数也是为了在不修改原对象的前提下生成新的实例,这有助于避免很多可变状态带来的bug。以后使用copy()的时候一定要记得接收它的返回值哦~
备注:内容来源于stack exchange,提问作者Vivek Modi
相关产品推荐
相关产品推荐

