有人能解释一下Kotlin数据类的copy
方法到底是如何工作的吗?对于一些成员来说,似乎实际上并没有创建(深)副本,并且引用仍然是对原件的引用.
fun test() {
val bar = Bar(0)
val foo = Foo(5, bar, mutableListOf(1, 2, 3))
println("foo : $foo")
val barCopy = bar.copy()
val fooCopy = foo.copy()
foo.a = 10
bar.x = 2
foo.list.add(4)
println("foo : $foo")
println("fooCopy: $fooCopy")
println("barCopy: $barCopy")
}
data class Foo(var a: Int,
val bar: Bar,
val list: MutableList<Int> = mutableListOf())
data class Bar(var x: Int = 0)
输出:
foo:foo(a=5,bar=bar(x=0),list=[1,2,3])
foo:foo(a=10,bar=bar(x=2),list=[1,2,3,4])
fooCopy:foo(a=5,bar=Bar(x=2),list=[1,2,3,4])
barCopy:bar(x=0)
为什么是barCopy.x=0
(预计),但fooCopy.bar.x=2
(我认为应该是0).由于Bar
也是一个数据类,所以当执行foo.copy()
时,我希望foo.bar
也是一个副本.
To deep copy all members, I can do something like this:
val fooCopy = foo.copy(bar = foo.bar.copy(), list = foo.list.toMutableList())
fooCopy: Foo(a=5, bar=Bar(x=0), list=[1, 2, 3])
But am I missing something or is there a better way to do this without needing to specify that these members need to force a deep copy?