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

时间:2019-07-17 13:11:42

标签: android list kotlin 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”。

即使更改了list元素,我如何确保原始copyList元素也没有变化?

1 个答案:

答案 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() }

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