data class в Kotlin — что это, синтаксис и особенности классов данных

Автор: IT Sectr Опубликовано: 2026-06-20 Время чтения: 10 мин

data class в Kotlin — это специальный тип класса, предназначенный исключительно для хранения данных. Компилятор автоматически генерирует методы equals, hashCode, toString, copy и componentN на основе свойств, указанных в primary constructor. Согласно документации JetBrains (2026), data class позволяет сократить объём шаблонного кода на 50–70% по сравнению с Java-эквивалентами и является основой для value-объектов в Kotlin-проектах.

Главное

  • data — ключевое слово для объявления класса данных в Kotlin
  • equals и hashCode — генерируются автоматически на основе всех свойств primary constructor
  • copy — функция поверхностного копирования с возможностью замены отдельных полей
  • componentN — деструктуризация data class на отдельные переменные
  • Primary constructor должен содержать минимум один val или var параметр

Что такое data class в Kotlin?

data class — это синтаксическая конструкция Kotlin, которая автоматически генерирует стандартные методы для классов, чья основная цель — хранение данных. При объявлении data class компилятор создаёт реализации equals, hashCode, toString, copy и componentN на основе всех свойств из primary constructor.

В отличие от обычных классов в Java, где разработчику приходится вручную писать геттеры, сеттеры, equals, hashCode и toString с помощью IDE или библиотек типа Lombok, Kotlin предоставляет встроенный механизм. Это не только сокращает код, но и гарантирует консистентность — автоматические методы всегда соответствуют текущей структуре свойств.

По данным JetBrains Kotlin Survey (2025), data class используется в 78% Kotlin-проектов, что делает его одной из самых востребованных возможностей языка. Особенно популярен он в архитектурах с DTO, моделями API-ответов и state-объектами в MVVM.

Синтаксис и основные возможности

data class объявляется с ключевым словом data перед class. Все свойства, участвующие в автоматических методах, указываются в primary constructor.

kotlin
data class User(
    val id: Int,
    val name: String,
    val email: String
)

Одна строка кода заменяет десятки строк boilerplate в Java. Компилятор генерирует equals, hashCode, toString, copy и component1–component3 для всех трёх свойств.

Свойства вне primary constructor

Автоматические методы включают только свойства из primary constructor. Если объявить свойство в теле класса, оно не участвует в equals, hashCode, toString и copy.

kotlin
data class Product(
    val id: Int,
    val title: String
) {
    var cachedPrice: Double = 0.0
    // cachedPrice is NOT included in equals/hashCode/copy
}

Ограничения primary constructor

Primary constructor data class должен содержать минимум один параметр. Все параметры должны быть помечены val или var. Нельзя использовать open, abstract, sealed или inner модификаторы для data class.

Автоматические методы equals, hashCode и toString

equals и hashCode генерируются на основе значений всех свойств из primary constructor. Два экземпляра data class считаются равными, если все их соответствующие свойства равны.

equals для value-сравнения

В Java сравнение объектов по умолчанию — это сравнение ссылок (==). Для сравнения по значению требуется переопределение equals. Kotlin data class делает это автоматически, позволяя использовать == для структурного сравнения.

kotlin
data class Address(
    val city: String,
    val street: String
)

val a1 = Address("Moscow", "Tverskaya")
val a2 = Address("Moscow", "Tverskaya")
println(a1 == a2)  // true

toString для отладки

Метод toString возвращает читаемое представление объекта с именами и значениями всех свойств. Это существенно упрощает логирование и отладку по сравнению с Java, где по умолчанию выводится hash-код в шестнадцатеричном формате.

По данным Kotlin Documentation (2026), toString data class имеет формат: "User(id=1, name=John, email=john@example.com)". При удалении свойств из primary constructor toString автоматически обновляется — риск рассинхронизации исключён.

Функция copy и деструктуризация

copy — одна из ключевых возможностей data class. Она создаёт поверхностную копию объекта с возможностью изменить значения указанных свойств.

kotlin
data class Order(
    val id: Long,
    val status: String,
    val amount: Double
)

val order = Order(1L, "Pending", 299.99)
val updatedOrder = order.copy(status = "Confirmed")
// updatedOrder.id = 1L, amount = 299.99, status = "Confirmed"

copy незаменим в функциональном стиле и архитектурах с неизменяемостью (immutability). Вместо мутации существующего объекта создаётся новая копия с изменёнными полями, что делает код более предсказуемым и безопасным в многопоточных сценариях.

Деструктуризация через componentN

data class автоматически генерирует функции component1, component2 и так далее для каждого свойства в порядке их объявления. Это позволяет деструктурировать объект на переменные.

kotlin
val user = User(1, "Alice", "alice@example.com")
val (id, name, email) = user
println("$id: $name ($email)")  // "1: Alice (alice@example.com)"

Деструктуризация работает также в лямбдах и for-each циклах, что делает data class удобным для работы с коллекциями.

Ограничения и рекомендации

Первое ограничение — data class не поддерживает наследование от другого data class. Можно наследовать только от обычных классов или интерфейсов.

Второе — автоматические методы включают только свойства primary constructor. Свойства в теле класса игнорируются, что может привести к некорректному equals, если вы забудете об этом.

Третье — data class не может быть open, abstract, sealed или inner. Он всегда final.

Четвёртое — для коллекций внутри data class copy выполняет поверхностное копирование. Изменение элементов внутри скопированной коллекции отразится на оригинале.

По данным Kotlin Best Practices (2026), data class оптимален для DTO, API-моделей, value objects и state-объектов. Для компонентов с бизнес-логикой рекомендуется использовать обычные классы.

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

Может ли data class наследовать другой data class?

Нет, data class не может наследовать другой data class. Однако он может наследовать обычный класс или реализовывать интерфейсы.

Сколько свойств должно быть в primary constructor?

Минимум одно свойство. Максимальное количество не ограничено, но для деструктуризации сгенерировано до componentN.

Входят ли свойства из тела класса в equals?

Нет, автоматические методы учитывают только свойства из primary constructor. Свойства из тела класса не участвуют в equals, hashCode, toString и copy.

Можно ли переопределить автоматические методы вручную?

Да, вы можете переопределить equals, hashCode или toString в теле data class. В этом случае компилятор не генерирует свою реализацию.

Чем data class отличается от обычного класса?

data class автоматически генерирует equals, hashCode, toString, copy и componentN. Обычный класс не предоставляет этих методов без ручной реализации.

Итоги

  • data class — синтаксическая конструкция Kotlin для хранения данных с авто-генерацией методов
  • equals и hashCode — структурное сравнение на основе свойств primary constructor
  • toString — читаемое представление объекта для отладки и логирования
  • copy — поверхностное копирование с заменой отдельных полей по именованным аргументам
  • componentN — деструктуризация objects на переменные для удобной работы с коллекциями
  • Ограничения — final по умолчанию, минимум одно свойство, нет наследования data->data
  • Применение — DTO, API-модели, value objects, state в MVVM

Мы разработаем мобильное приложение под ключ

IT Sectr создаёт приложения для iOS и Android для стартапов и бизнеса с 2017 года. Мы проконсультируем вас и предложим наилучшее решение.

Обсудить проект

Читайте также