所以我有以下数据类:
data class Client(val name: String, val pastAddresses: ArrayList<String>)
通过以下代码:
val aClient = Client("Alice", arrayListOf("foo", "bar"))
println(aClient)
val cClient = aClient.copy()
cClient.pastAddresses.add("Blah")
cClient.pastAddresses.remove("foo")
println(aClient)
我看到了:
Client(name=Alice, pastAddresses=[foo, bar])
Client(name=Alice, pastAddresses=[bar, Blah])
这意味着Kotlin数据类中的副本是浅表副本。
有没有办法做深拷贝?
答案 0 :(得分:3)
你是对的。默认的copy()
方法将创建浅表副本。
通常情况下,我们需要复制一个对象以更改某些内容 它的属性,但其余部分保持不变。这就是copy() 函数是为此生成的。
您可以覆盖它,以便它可以执行您需要的操作。但是我建议您创建一个创建 deep 副本的新方法,将其命名为deepCopy()
。为什么会更好?因为如果您的应用程序增长了,在某些情况下您仍然需要浅表副本。这就是为什么使用2种不同的方法可以帮助区分它的原因。