Назад к вопросам
Junior
98
questionbank

Как работают data-классы в Kotlin?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

Data-классы в Kotlin используются для хранения данных. Компилятор автоматически генерирует для них стандартные методы:

  • equals(): Сравнивает экземпляры на основе значений их свойств.
  • hashCode(): Генерирует хеш-код на основе значений свойств.
  • toString(): Возвращает строковое представление, включающее имена и значения всех свойств.
  • copy(): Создает копию объекта, при необходимости изменяя значения указанных свойств.
  • componentN(): Методы для деструктуризации (разложения объекта на отдельные свойства).
// Пример data-класса
data class User(val name: String, val age: Int)

fun main() {
    val user1 = User("Alice", 30)
    val user2 = User("Alice", 30)
    val user3 = User("Bob", 25)

    // equals()
    println(user1 == user2) // true
    println(user1 == user3) // false

    // toString()
    println(user1.toString()) // User(name=Alice, age=30)

    // copy()
    val user4 = user1.copy(age = 31)
    println(user4) // User(name=Alice, age=31)


    // componentN() и деструктуризация
    val (name, age) = user1
    println("Name: $name, Age: $age") // Name: Alice, Age: 30
}

Ключевые моменты:

  • Все свойства, определенные в основном конструкторе, должны быть либо val, либо var.
  • Data-класс не может быть abstract, open, sealed или inner.
  • Data-классы могут наследовать другие классы или реализовывать интерфейсы.
  • Свойства, объявленные вне основного конструктора, не участвуют в генерации стандартных методов.
Метод Описание
equals() Сравнивает свойства из основного конструктора.
hashCode() Генерирует хеш на основе свойств из основного конструктора.
toString() Выводит строковое представление свойств из основного конструктора.
copy() Создает поверхностную копию с возможностью изменения свойств.
componentN() Предоставляет доступ к свойствам по порядку их объявления в конструкторе.

Data-классы значительно упрощают работу с POJO (Plain Old Java Object) или DTO (Data Transfer Object), уменьшая бойлерплейт-код.