有人能解释一下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` 也会被复制。
要深复制所有成员,可以这样做:
val fooCopy = foo.copy(bar = foo.bar.copy(), list = foo.list.toMutableList())
fooCopy: Foo(a=5, bar=Bar(x=0), list=[1, 2, 3])
但是我是否漏掉了什么,或者有没有更好的方法可以在不需要指定这些成员需要强制进行深层复制的情况下完成此操作?
.copy()
方法的行为,并且复制的对象是一个深拷贝
。https://pastes.io/bdmzouljgz 你能解释一下为什么你坚持认为它是一个浅拷贝吗? - undefined