DevCN
菜单
全部文章快讯开发科技深度热点

Kotlin data class:复制任务状态并保留原记录

用数据类保存任务,通过 copy 创建已完成版本,验证原记录不变,并理解浅复制、只读接口与真正不可变的差别。


本节目标

用数据类保存任务,通过 copy 创建已完成版本,验证原记录不变,并理解浅复制、只读接口与真正不可变的差别。

环境与运行方法

准备 JDK 和 Kotlin/JVM 编译器。保存为 Lesson.kt,执行 kotlinc Lesson.kt -include-runtime -d lesson.jar,然后运行 java -jar lesson.jar。示例使用 Kotlin 2.x 的稳定基础语法。

核心思路

data class 自动提供 copy 和结构化比较。val 成员不允许直接重新赋值,状态变化通过新对象表达。copy 复制字段,不负责把嵌套可变对象全部复制。

完整示例

data class Task(val title: String, val minutes: Int, val done: Boolean)
fun main() {
    val original = Task("review", 30, false)
    val updated = original.copy(done = true)
    val tasks = listOf(original, updated)
    println("original=" + original.done + " updated=" + updated.done)
    println("completed=" + tasks.count { it.done })
    println("minutes=" + tasks.filter { it.done }.sumOf { it.minutes })
}

预期输出

original=false updated=true
completed=1
minutes=30

逐步理解

copy 只替换 done,其他字段沿用原值。为了展示差别,本例把两个版本放入同一列表;真实任务系统通常只保留一个当前版本,否则可能重复统计。

若成员包含 MutableList,两个副本可能共享它。listOf 的只读接口也不等于元素深度不可变。决定状态模型时,应同时考虑外层集合、内部对象和历史版本的生命周期。

常见问题与边界

  • copy 不是深拷贝。
  • 历史版本与当前数据混合会重复统计。
  • 改为 var 成员后,外部可以直接修改状态。

动手练习

同时把 updated 的分钟数改成 45,观察原记录。

参考答案

原记录仍是 30 分钟且未完成,新版本是 45 分钟且完成,总完成分钟数变成 45。基本值字段使复制关系容易理解。

DISCUSSION

文章回复

0 条公开回复
未登录回复需要审核后公开
还没有回复,欢迎参与讨论。