Kotlin数据类copy()方法调用后成员变量值丢失原因咨询
问题原因及解决办法
核心原因
Kotlin的data class自动生成的copy()函数仅会处理主构造函数中声明的属性,类体内部额外定义的属性不会被包含在自动复制逻辑里。
你的BookObject类中,description和owningCompanyData是主构造函数的参数,而id、createdAt、createdBy、modifiedAt是在类体里单独声明的var属性。当调用copy()创建新对象时,新对象只会初始化主构造里的属性,类体里的这些属性会使用默认值(这里就是null),自然就丢失了原对象的字段值。
Kotlin官方文档的描述:
使用copy()函数复制对象时,可修改部分属性,同时保持其余属性不变。
这里的“其余属性”特指主构造函数中声明的属性,并非类体内额外定义的属性。
解决办法
有两种常见方案可以解决这个问题:
方案一:将类体属性移至主构造函数
把id等属性放到主构造函数中,这样copy()会自动处理这些属性的复制:
data class BookObject( val description: String?, val owningCompanyData: OwningCompanyData?, var id: String? = null, var createdAt: Instant? = null, var createdBy: String? = null, var modifiedAt: Instant? = null ) { fun update(command: CreateOrUpdateBookObjectCommand): BookObject = this.copy( description = command.description, owningCompanyData = command.owningCompanyData ) }
方案二:手动赋值类体属性
如果不想调整主构造函数,可以在copy()之后,手动把原对象的类体属性值赋值给新对象:
fun update(command: CreateOrUpdateBookObjectCommand): BookObject = this.copy( description = command.description, owningCompanyData = command.owningCompanyData ).apply { id = this@update.id createdAt = this@update.createdAt createdBy = this@update.createdBy modifiedAt = this@update.modifiedAt }
内容的提问来源于stack exchange,提问作者NeverSleeps
相关产品推荐
相关产品推荐

