copy и equals
Сгенерированные функции
«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 — локальная установка не требуется.