我正在使用伴随对象临时保存一些数据。
我可能想更改此数据,并且还想确保在进行更改时原始对象没有更改。
我尝试过了。
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
进行更改?
答案 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 = firstList
是firstList
对secondList
的引用。这样想,您的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)