前不久 JetBrains 在北京搞了一次技术大会,我在演讲当中提到了一个叫 DeepCopy 的库,那么我们今天就来详细说说它。
我们有什么拷贝的需求?
我们知道 Kotlin 的 data class 出厂自带了一套 copy
方法,这个 copy
方法呢,就是实打实的一个浅拷贝,例如:
data class GitUser(val name: String)
它的 copy
方法其实就相当于:
data class GitUser(val name: String) {
fun copy(name: String = this.name) = GitUser(name)
}
如果成员是 val
那倒也还好,可如果是另一个数据类呢?
data class GitUser(val name: String)
data class Project(val name: String)
data class Owner(val gitUser: GitUser, val project: Project)
我们如果需要 copy
一下 Owner
的话,我们就会发现新实例与旧实例共享了 GitUser
和 Project
的实例,万一项目的名称是可以改的:
data class Project(var name: String)
新实例的 project
的名称我想更改一下,结果发现老实例的也被改了。
所以你需要一个 DeepCopy 的方法:
data class