数据类中的Kotlin副本是否浅表副本?

时间:2019-09-08 09:35:49

标签: kotlin

所以我有以下数据类:

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数据类中的副本是浅表副本。
有没有办法做深拷贝?

1 个答案:

答案 0 :(得分:3)

你是对的。默认的copy()方法将创建浅表副本。

看看Kotlin documentation

  

通常情况下,我们需要复制一个对象以更改某些内容   它的属性,但其余部分保持不变。这就是copy()   函数是为此生成的。

您可以覆盖它,以便它可以执行您需要的操作。但是我建议您创建一个创建 deep 副本的新方法,将其命名为deepCopy()。为什么会更好?因为如果您的应用程序增长了,在某些情况下您仍然需要浅表副本。这就是为什么使用2种不同的方法可以帮助区分它的原因。