data class в Kotlin — это специальный тип класса, предназначенный исключительно для хранения данных. Компилятор автоматически генерирует методы equals, hashCode, toString, copy и componentN на основе свойств, указанных в primary constructor. Согласно документации JetBrains (2026), data class позволяет сократить объём шаблонного кода на 50–70% по сравнению с Java-эквивалентами и является основой для value-объектов в 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.
data class User(
val id: Int,
val name: String,
val email: String
)
Одна строка кода заменяет десятки строк boilerplate в Java. Компилятор генерирует equals, hashCode, toString, copy и component1–component3 для всех трёх свойств.
Автоматические методы включают только свойства из primary constructor. Если объявить свойство в теле класса, оно не участвует в equals, hashCode, toString и copy.
data class Product(
val id: Int,
val title: String
) {
var cachedPrice: Double = 0.0
// cachedPrice is NOT included in equals/hashCode/copy
}
Primary constructor data class должен содержать минимум один параметр. Все параметры должны быть помечены val или var. Нельзя использовать open, abstract, sealed или inner модификаторы для data class.
equals и hashCode генерируются на основе значений всех свойств из primary constructor. Два экземпляра data class считаются равными, если все их соответствующие свойства равны.
В Java сравнение объектов по умолчанию — это сравнение ссылок (==). Для сравнения по значению требуется переопределение equals. Kotlin data class делает это автоматически, позволяя использовать == для структурного сравнения.
data class Address(
val city: String,
val street: String
)
val a1 = Address("Moscow", "Tverskaya")
val a2 = Address("Moscow", "Tverskaya")
println(a1 == a2) // true
Метод toString возвращает читаемое представление объекта с именами и значениями всех свойств. Это существенно упрощает логирование и отладку по сравнению с Java, где по умолчанию выводится hash-код в шестнадцатеричном формате.
По данным Kotlin Documentation (2026), toString data class имеет формат: "User(id=1, name=John, email=john@example.com)". При удалении свойств из primary constructor toString автоматически обновляется — риск рассинхронизации исключён.
copy — одна из ключевых возможностей data class. Она создаёт поверхностную копию объекта с возможностью изменить значения указанных свойств.
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). Вместо мутации существующего объекта создаётся новая копия с изменёнными полями, что делает код более предсказуемым и безопасным в многопоточных сценариях.
data class автоматически генерирует функции component1, component2 и так далее для каждого свойства в порядке их объявления. Это позволяет деструктурировать объект на переменные.
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. Однако он может наследовать обычный класс или реализовывать интерфейсы.
Минимум одно свойство. Максимальное количество не ограничено, но для деструктуризации сгенерировано до componentN.
Нет, автоматические методы учитывают только свойства из primary constructor. Свойства из тела класса не участвуют в equals, hashCode, toString и copy.
Да, вы можете переопределить equals, hashCode или toString в теле data class. В этом случае компилятор не генерирует свою реализацию.
data class автоматически генерирует equals, hashCode, toString, copy и componentN. Обычный класс не предоставляет этих методов без ручной реализации.
Итоги
Мы разработаем мобильное приложение под ключ
IT Sectr создаёт приложения для iOS и Android для стартапов и бизнеса с 2017 года. Мы проконсультируем вас и предложим наилучшее решение.
Читайте также