我有一个Activity A
,其中有:
class ActivityA {
companion object {
var list: MutableList<Person> = //objects are acquired here.
}
}
在ActivityB
中,我将此列表复制到变量中。
class ActivityB {
var copyList: MutableList<Person> = ActivityA.list.toMutableList()
}
之后,我要更改copyList
的一些数据。例如,让我们更改任何元素的名称。假设原始的list
有list.get(0).name = "Bruno"
。现在,更改为其他内容。
copyList.get(0).name = "Alex"
问题是,这也导致索引{0}中的元素也在list
中更改。这意味着list.get(0).name
和copyList.get(0).name
现在具有相同的名称“ Alex”。
即使更改了list
元素,我如何确保原始copyList
元素也没有变化?
答案 0 :(得分:1)
您将需要定义一个复制Person
的方法(可能是其所有字段的递归副本,否则您将遇到类似的问题)。如果它是data class
,则已经有copy()
方法,但是请注意,它不会复制字段。并且在JVM上,您可以使用Cloneable
来获取https://discuss.kotlinlang.org/t/how-to-use-cloneable/2364中所述的非数据类的默认实现,但是通常不建议这样做。
无论如何,拥有后,
var copyList: MutableList<Person> = ActivityA.list.mapTo(mutableListOf<Person>()) { it.copy() }
但这就是为什么您应该首先喜欢不变性的原因之一。