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
)

Один рядок коду замінює десятки рядків шаблонного коду в 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 — деструктуризація об'єктів на змінні для зручної роботи з колекціями
  • Обмеження — final за замовчуванням, мінімум одна властивість, немає наслідування data->data
  • Застосування — DTO, API-моделі, value objects, state в MVVM

Ми розробимо мобільний застосунок під ключ

IT Sectr створює застосунки для iOS та Android для стартапів і бізнесу з 2017 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.

Обговорити проект

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