有人可以解釋Kotlin數據類的copy
方法的工作原理嗎?對於某些成員來說,似乎(實際)複製實際上並未創建,並且引用仍然是原始的。Kotlin數據類複製方法不深拷貝所有成員
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:美孚(α= 5,條=欄(X = 0),則列表= [1,2,3])
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:酒吧(X = 0)
爲什麼barCopy.x=0
(預期),但fooCopy.bar.x=2
(我認爲這將是0)。由於Bar
也是一個數據類,所以當foo.copy()
執行時,我預計foo.bar
也是一個副本。
要深拷貝所有成員,我可以做這樣的事情:
val fooCopy = foo.copy(bar = foo.bar.copy(), list = foo.list.toMutableList())
fooCopy:美孚(α= 5,條=欄(X = 0),則列表= [1,2, 3])
但是我錯過了什麼或有沒有更好的方法來做到這一點,而無需指定這些成員需要強制深度複製?