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。基本值字段使复制关系容易理解。
文章回复
0 条公开回复