Копирование элементов из другого списка (сохраненных в сопутствующем объекте) и их изменение, также отражающее изменения в исходном сопутствующем объекте.

У меня есть 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 теперь имеют одинаковые имена "Алекс".

Как я могу убедиться, что исходные list элементы не изменились, хотя copyList элементы были изменены?


person Azizjon Kholmatov    schedule 17.07.2019    source источник


Ответы (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() }

Но это одна из причин, почему вы должны в первую очередь предпочесть неизменность.

person Alexey Romanov    schedule 17.07.2019