从另一个列表(保存在伴生对象中)复制元素并修改它们也反映对原始伴生对象的修改
Copying elemets from another list (saved in companion object) and modfying them also reflecting modifications to the original companion object
我有一个 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"。
如何确保即使 copyList
元素已更改,原始 list
元素也不会更改?
您需要定义一个方法来制作 Person
的副本(并且可能递归地复制其任何字段,否则您将 运行 陷入类似的问题)。如果它是 data class
,则已经有一个 copy()
方法,但请注意它不会复制字段。在 JVM 上,您可以使用 Cloneable
来获取 non-data 类 的默认实现,如 https://discuss.kotlinlang.org/t/how-to-use-cloneable/2364 中所述,但通常不推荐这样做。
总之,有了之后,
var copyList: MutableList<Person> = ActivityA.list.mapTo(mutableListOf<Person>()) { it.copy() }
但这就是为什么您首先应该更喜欢不变性的部分原因。
我有一个 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"。
如何确保即使 copyList
元素已更改,原始 list
元素也不会更改?
您需要定义一个方法来制作 Person
的副本(并且可能递归地复制其任何字段,否则您将 运行 陷入类似的问题)。如果它是 data class
,则已经有一个 copy()
方法,但请注意它不会复制字段。在 JVM 上,您可以使用 Cloneable
来获取 non-data 类 的默认实现,如 https://discuss.kotlinlang.org/t/how-to-use-cloneable/2364 中所述,但通常不推荐这样做。
总之,有了之后,
var copyList: MutableList<Person> = ActivityA.list.mapTo(mutableListOf<Person>()) { it.copy() }
但这就是为什么您首先应该更喜欢不变性的部分原因。