从另一个列表(保存在伴生对象中)复制元素并修改它们也反映对原始伴生对象的修改

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 的一些数据。例如,让我们更改任何元素的名称。假设原始 listlist.get(0).name = "Bruno"。现在,换成别的东西。

 copyList.get(0).name = "Alex" 

问题是这也导致索引 0 处的元素在 list 中也发生了变化。这意味着 list.get(0).namecopyList.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() }

但这就是为什么您首先应该更喜欢不变性的部分原因。