You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 15:25:23