Kotlin Academy · Урок

copy и equals

Сгенерированные функции

Урок 2 из 413 шагов

«copy и equals» — бесплатный урок Kotlin Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Kotlin Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Kotlin Academy содержит 4 уроков всего.

Сгенерированные функции

Помимо toString, класс данных создаёт равенство, hashCode и copy.

Эти три возможности делают классы данных удобными для сравнения и клонирования.

Структурное равенство

Сгенерированная функция equals сравнивает объекты по значениям их свойств, а не по их идентичности.

Два экземпляра класса данных с одинаковыми значениями считаются равными при использовании ==.

data class User(val name: String, val age: Int)

fun main() {
    val a = User("Alice", 30)
    val b = User("Alice", 30)
    println(a == b)
}

Разные значения не равны

Измените любое свойство — и объекты больше не будут равны.

Равенство вычисляется на основе каждого свойства основного конструктора.

data class User(val name: String, val age: Int)

fun main() {
    val a = User("Alice", 30)
    val b = User("Alice", 31)
    println(a == b)
}

Равенство и идентичность

Используйте == для равенства значений (структурного равенства), а === — для равенства ссылок (идентичности).

Два равных объекта данных могут быть разными экземплярами в памяти.

data class User(val name: String)

fun main() {
    val a = User("Alice")
    val b = User("Alice")
    println(a == b)  // values match
    println(a === b) // different instances
}

Согласованный hashCode

hashCode создаётся согласованно с equals: равные объекты дают одинаковое хеш-значение.

Благодаря этому классы данных правильно работают в наборах и в качестве ключей отображений.

data class Point(val x: Int, val y: Int)

fun main() {
    val a = Point(1, 2)
    val b = Point(1, 2)
    println(a.hashCode() == b.hashCode())
}

Функция copy

copy создаёт новый объект, идентичный исходному.

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

data class User(val name: String, val age: Int)

fun main() {
    val a = User("Alice", 30)
    val b = a.copy()
    println(b)
    println(a == b)
}

Копирование с изменениями

Передавайте именованные аргументы в copy, чтобы изменить отдельные свойства, сохранив остальные.

Это стандартный способ обновления неизменяемых данных.

data class User(val name: String, val age: Int)

fun main() {
    val a = User("Alice", 30)
    val older = a.copy(age = 31)
    println(a)
    println(older)
}

Копирование не изменяет оригинал

copy никогда не изменяет исходный объект. Оригинал сохраняет свои значения.

Благодаря неизменяемости изменения состояния становятся предсказуемыми и безопасными.

data class Account(val owner: String, val balance: Int)

fun main() {
    val original = Account("Sam", 100)
    val updated = original.copy(balance = 150)
    println(original.balance)
    println(updated.balance)
}

Цепочка копирований

Поскольку copy возвращает новый объект, Вы можете последовательно применить несколько обновлений.

Каждый шаг создаёт новое независимое значение.

data class Config(val volume: Int, val muted: Boolean)

fun main() {
    val base = Config(50, false)
    val result = base.copy(volume = 70).copy(muted = true)
    println(result)
}

Учитываются только свойства конструктора

Как и при проверке равенства, copy работает только со свойствами основного конструктора.

Свойствам тела класса при копировании присваиваются значения по умолчанию, поэтому храните важное состояние в конструкторе.

data class User(val name: String) {
    var note: String = "none"
}

fun main() {
    val a = User("Alice")
    a.note = "VIP"
    val b = a.copy()
    println(b.note) // back to default
}

Объединяем всё

Сгенерированные функции придают классам данных их мощь:

  • equals и == сравнивают объекты по значению
  • hashCode остаётся согласованным с равенством
  • copy клонирует объект с возможностью выборочных изменений
data class User(val name: String, val age: Int)

fun main() {
    val a = User("Alice", 30)
    val b = a.copy(name = "Alicia")
    println(a == b)
    println(b)
}

Быстрая проверка

Проверьте, насколько хорошо Вы понимаете функции copy и equals.

Итоги

Вы изучили сгенерированные функции классов данных:

  • равенство сравнивает объекты по значению, == и ===
  • hashCode остаётся согласованным для коллекций
  • copy клонирует объект с выборочными изменениями

Далее Вы узнаете, как деструктуризация распаковывает объекты в переменные.

Можно начать бесплатно

Изучай Kotlin с ИИ-репетитором — бесплатно

Пиши и запускай код прямо в браузере, получай мгновенную помощь от ИИ-репетитора 24/7 и продолжи учиться на сайте или в приложении.

Курсы
51
Уроки
203

Часто задаваемые вопросы

Урок «copy и equals» бесплатный?

Да — полный текст урока «copy и equals» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Kotlin Academy, подпишись на CoddyKit PRO. Курс Kotlin Academy содержит 4 уроков всего.

Чему я научусь в уроке «copy и equals»?

Сгенерированные функции Ты практикуешь Kotlin Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Kotlin Academy?

Предыдущий опыт не требуется. Kotlin Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.

Сколько времени занимает урок «copy и equals»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Kotlin Academy?

Да. Каждый урок Kotlin Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Объявление классов данных
  2. copy и equals
  3. Деструктурирующие объявления
  4. Классы данных в коллекциях
← Назад к Kotlin Academy