Может ли кто-нибудь объяснить, как работает метод 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: 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.bar
также будет копией при выполнении foo.copy()
.
Чтобы полностью скопировать всех участников, я могу сделать что-то вроде этого:
val fooCopy = foo.copy(bar = foo.bar.copy(), list = foo.list.toMutableList())
fooCopy: Foo (a = 5, bar = Bar (x = 0), list = [1, 2, 3])
Но я что-то упустил или есть лучший способ сделать это, не указывая, что этим членам нужно заставить глубокую копию?