Как я могу дублировать объект на другой объект, не меняя базовый объект в Kotlin? - PullRequest
0 голосов
/ 08 мая 2018

это мой код:

var header1: Record? = null
var header2: Record? = null

header2 = header1
header2.name = "new_name"

но header1.name тоже меняется!

Ответы [ 3 ]

0 голосов
/ 08 мая 2018

Вы просто присваиваете тот же объект (тот же кусок памяти) другой переменной.Вам нужно каким-то образом создать новый экземпляр и установить все поля.

header2 = Record()
header2.name = header1.name

Однако в Kotlin, если класс Record был Класс данных , Kotlin создал бы для вас метод копирования.

data class Record(val name: String, ...)
...
header2 = header1.copy()

И метод копирования позволяет переопределить поля, которые необходимо переопределить.

header2 = header1.copy(name = "new_name")
0 голосов
/ 09 мая 2018

У вас есть 2 варианта использования метода копирования, если второй объект должен быть точно таким же или некоторые поля должны быть изменены.

val alex = User(name = "Alex", age = 1)
val olderAlex = jack.copy(age = 2)

или Котлин получил отличный синтаксис конструирования объекта, который я имею в виду, например,

createSomeObject(obj = ObjInput(name = objName,
                    password = UUID.randomUUID().toString()
                    type = listOf(TYPE)))

На самом деле, кажется, в вашем случае проще использовать первый, но полезно знать о втором способе решения этой задачи.

0 голосов
/ 08 мая 2018

Вы должны создать новый экземпляр переменной и инициализировать каждое поле. Если вы просто делаете header2 = header1, вы также передаете ссылку header1 на header2.

Пример (Java):

public Record(Record record) {
    this.name = record.name;
}

Тогда назовите его так: header2 = new Record(header1);

См .: Является ли Java "передачей по ссылке" или "передачей по значению"?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...