Найти в Дзене

copy() в дата классе

Когда мы создаём data class Cat(val name: String, val mood: String) kotlin автоматически добавляет в него метод copy(), который: Метод copy() для нашего котика выглядит примерно так: fun copy(name: String = this.name, mood: String = this.mood): Cat {
return Cat(name, mood)
} То есть мы можем поменять одно поле, а остальные останутся как в исходном объекте. copy() делает поверхностную копию. Это значит: Тут видно, что copy() не делает глубокую копию. Он просто скопировал ссылку на коробочку и она одна у двух котов. При этом самый котики разные, просто с одинаковыми параметрами. 1. Например, когда нам нужно изменить только один параметр у объекта. 2. Если мы не хотим менять объект напрямую, тогда просто создаём новый — это безопаснее. Используем copy() и будет нам счастье. Дубль статей в телеграмме — https://t.me/android_junior Мои заметки в телеграмме — https://t.me/android_junior_notes
Оглавление

Когда мы создаём data class Cat(val name: String, val mood: String) kotlin автоматически добавляет в него метод copy(), который:

  • создаёт новый объект того же типа
  • с такими же значениями всех полей, кроме тех, которые мы переопределяем

Пример:

Как copy() работает под капотом

Метод copy() для нашего котика выглядит примерно так:

fun copy(name: String = this.name, mood: String = this.mood): Cat {
return Cat(name, mood)
}

То есть мы можем поменять одно поле, а остальные останутся как в исходном объекте.

Что копируется — значения или ссылки?

copy() делает поверхностную копию. Это значит:

  • Если поле — примитив (Int, Boolean, String (да, строка - это не примитив, но тут он как простой объект)) — оно просто копируется.
  • Если поле — объект (например, список или другой класс), копируется ссылка.

🧪 Пример:

-2

Тут видно, что copy() не делает глубокую копию. Он просто скопировал ссылку на коробочку и она одна у двух котов. При этом самый котики разные, просто с одинаковыми параметрами.

Когда copy() особенно полезен

1. Например, когда нам нужно изменить только один параметр у объекта.

2. Если мы не хотим менять объект напрямую, тогда просто создаём новый — это безопаснее.

Что не так с copy()?

  • Он не делает глубокую копию. Если нужно прям скопировать всё — надо быть внимательными.
  • Если у нас 10+ полей, copy() может быть огромным, особенно если нужно менять много сразу.

🐾 Вывод

Используем copy() и будет нам счастье.

-3

Дубль статей в телеграмме — https://t.me/android_junior

Мои заметки в телеграмме — https://t.me/android_junior_notes