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, където разработчикът трябва ръчно да пише getter-и, setter-и, 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
)
Един ред код замества десетки редове шаблонен код в 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 НЕ е включен в 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) // вярно
Методът 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 г. Ще ви консултираме и ще предложим най-доброто решение.
Прочетете също