如何复制伴侣对象并进行更改而又不将这些更改反映到原始对象上?

时间:2019-07-17 07:53:39

标签: android list arraylist kotlin companion-object

我正在使用伴随对象临时保存一些数据。

我可能想更改此数据,并且还想确保在进行更改时原始对象没有更改。

我尝试过了。

companion object{
        var position: Int = 0
    } 
var copyPosition = positon
copyPosition--
println(copyPosition)

这可以正常工作并打印-1。原始position不变。 (值0不变)。

但是,与List<MyObject>相同的操作不起作用。

companion object{
        var list: MutableList<MyObject> = "...here objects are aquired..."
    } 
var tempList: MutableList<MyObject> = list
tempList.removeAt(0)
println(list.size)

在这里,如果我从tempList中删除项目,则原始列表也会丢失此项目。我该如何阻止呢?如何仅对tempList而不是原始list进行更改?

1 个答案:

答案 0 :(得分:1)

您正在向tempList提供Companion object列表的引用。所做的任何更改也会反映在列表中。您可以做的是将MutableList<MyOjbect)的所有新对象.addAll()list创建到新的MutableList对象

示例

val firstList = mutableListOf(1,2,3,4,5)  //0x543DE (Dummy memory address)

val secondList = firstList  //Giving reference of firstList to the secondList  //0x543DE

如您所见,secondList = firstListfirstListsecondList的引用。这样想,您的firstList拥有对原始列表对象的引用。当我们写secondList = firstList时,我们给secondList的引用是firstList val指向的列表。现在,这两个val都指向内存中的同一对象。

现在secondList中所做的更改也将反映到“原始”列表中。但为什么?您猜对了,因为它们都指向同一个对象。

对于解决方案,您可以:

companion object{
    var list: MutableList<MyObject> = "...here objects are aquired..."
} 
var tempList: MutableList<MyObject> = mutableListOf()
tempList.addAll(list) //This will iteratively copy list items to tempList
tempList.removeAt(0)
println(list.size)