data class v Kotlinu — co to je, syntaxe a vlastnosti datových tříd

Autor: IT Sectr Publikováno: 2026-06-20 Doba čtení: 10 min

data class v Kotlinu je speciální typ třídy určený výhradně pro ukládání dat. Kompilátor automaticky generuje metody equals, hashCode, toString, copy a componentN na základě vlastností uvedených v primary constructor. Podle dokumentace JetBrains (2026) umožňuje data class snížit objem boilerplate kódu o 50–70% oproti ekvivalentům v Javě a je základem pro value-objekty v Kotlin projektech.

Hlavní body

  • data — klíčové slovo pro deklaraci datové třídy v Kotlinu
  • equals a hashCode — automaticky generované na základě všech vlastností primary constructor
  • copy — funkce mělké kopie s možností nahrazení jednotlivých polí
  • componentN — destrukturalizace data class na samostatné proměnné
  • Primary constructor musí obsahovat alespoň jeden val nebo var parametr

Co je data class v Kotlinu?

data class je syntaktická konstrukce Kotlinu, která automaticky generuje standardní metody pro třídy, jejichž hlavním účelem je ukládání dat. Při deklaraci data class kompilátor vytváří implementace equals, hashCode, toString, copy a componentN na základě všech vlastností z primary constructor.

Na rozdíl od běžných tříd v Javě, kde vývojář musí ručně psát gettery, settery, equals, hashCode a toString pomocí IDE nebo knihoven jako Lombok, Kotlin poskytuje vestavěný mechanismus. To nejen zkracuje kód, ale také zaručuje konzistenci — automatické metody vždy odpovídají aktuální struktuře vlastností.

Podle údajů JetBrains Kotlin Survey (2025) se data class používá v 78% Kotlin projektů, což z něj činí jednu z nejžádanějších funkcí jazyka. Je obzvláště populární v architekturách s DTO, modely odpovědí API a stavovými objekty v MVVM.

Syntaxe a hlavní možnosti

data class se deklaruje s klíčovým slovem data před class. Všechny vlastnosti účastnící se automatických metod jsou uvedeny v primary constructor.

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

Jeden řádek kódu nahrazuje desítky řádků boilerplate v Javě. Kompilátor generuje equals, hashCode, toString, copy a component1–component3 pro všechny tři vlastnosti.

Vlastnosti mimo primary constructor

Automatické metody zahrnují pouze vlastnosti z primary constructor. Pokud deklarujete vlastnost v těle třídy, neúčastní se equals, hashCode, toString a copy.

kotlin
data class Product(
    val id: Int,
    val title: String
) {
    var cachedPrice: Double = 0.0
    // cachedPrice NENÍ zahrnut v equals/hashCode/copy
}

Omezení primary constructor

Primary constructor data class musí obsahovat alespoň jeden parametr. Všechny parametry musí být označeny val nebo var. Pro data class nelze použít modifikátory open, abstract, sealed nebo inner.

Automatické metody equals, hashCode a toString

equals a hashCode jsou generovány na základě hodnot všech vlastností z primary constructor. Dvě instance data class jsou považovány za stejné, pokud jsou všechny jejich odpovídající vlastnosti stejné.

equals pro porovnání hodnot

V Javě je výchozí porovnání objektů porovnání referencí (==). Pro porovnání podle hodnoty je vyžadováno přepsání equals. Kotlin data class to dělá automaticky, což umožňuje použít == pro strukturální porovnání.

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

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

toString pro ladění

Metoda toString vrací čitelnou reprezentaci objektu s názvy a hodnotami všech vlastností. To výrazně zjednodušuje logování a ladění ve srovnání s Javou, kde se ve výchozím nastavení zobrazuje hash kód v hexadecimálním formátu.

Podle Kotlin Documentation (2026) má toString data class formát: „User(id=1, name=John, email=john@example.com)”. Při odstranění vlastností z primary constructor se toString automaticky aktualizuje — riziko desynchronizace je vyloučeno.

Funkce copy a destrukturalizace

copy — jedna z klíčových možností data class. Vytváří mělkou kopii objektu s možností změny hodnot zadaných vlastností.

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 je nepostradatelný ve funkcionálním stylu a architekturách s neměnností (immutability). Namísto mutace existujícího objektu se vytváří nová kopie se změněnými poli, což činí kód předvídatelnějším a bezpečnějším v vícevláknových scénářích.

Destrukturalizace pomocí componentN

data class automaticky generuje funkce component1, component2 a tak dále pro každou vlastnost v pořadí deklarace. To umožňuje destrukturalizaci objektu na proměnné.

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

Destrukturalizace funguje také v lambdách a cyklech for-each, což činí data class vhodným pro práci s kolekcemi.

Omezení a doporučení

První omezení — data class nepodporuje dědičnost od jiného data class. Dědit lze pouze od běžných tříd nebo rozhraní.

Druhé — automatické metody zahrnují pouze vlastnosti primary constructor. Vlastnosti v těle třídy jsou ignorovány, což může vést k nesprávnému equals, pokud na to zapomenete.

Třetí — data class nemůže být open, abstract, sealed nebo inner. Je vždy final.

Čtvrté — pro kolekce uvnitř data class provádí copy mělké kopírování. Změna prvků uvnitř zkopírované kolekce se projeví v originálu.

Podle Kotlin Best Practices (2026) je data class optimální pro DTO, API modely, value objects a stavové objekty. Pro komponenty s obchodní logikou se doporučuje používat běžné třídy.

Často kladené otázky

Může data class dědit jiný data class?

Ne, data class nemůže dědit jiný data class. Může však dědit běžnou třídu nebo implementovat rozhraní.

Kolik vlastností musí být v primary constructor?

Alespoň jedna vlastnost. Maximální počet není omezen, ale pro destrukturalizaci se generuje do componentN.

Vstupují vlastnosti z těla třídy do equals?

Ne, automatické metody berou v úvahu pouze vlastnosti z primary constructor. Vlastnosti z těla třídy se neúčastní equals, hashCode, toString a copy.

Lze automatické metody ručně přepsat?

Ano, můžete přepsat equals, hashCode nebo toString v těle data class. V tom případě kompilátor negeneruje vlastní implementaci.

Čím se data class liší od běžné třídy?

data class automaticky generuje equals, hashCode, toString, copy a componentN. Běžná třída tyto metody bez ruční implementace neposkytuje.

Shrnutí

  • data class — syntaktická konstrukce Kotlinu pro ukládání dat s automatickým generováním metod
  • equals a hashCode — strukturální porovnání na základě vlastností primary constructor
  • toString — čitelná reprezentace objektu pro ladění a logování
  • copy — mělké kopírování s nahrazením jednotlivých polí pomocí pojmenovaných argumentů
  • componentN — destrukturalizace objektů na proměnné pro pohodlnou práci s kolekcemi
  • Omezení — ve výchozím stavu final, alespoň jedna vlastnost, žádná dědičnost data->data
  • Použití — DTO, API modely, value objects, stav v MVVM

Vyvineme mobilní aplikaci na klíč

IT Sectr vytváří aplikace pro iOS a Android pro startupy a podniky od roku 2017. Poradíme vám a navrhneme nejlepší řešení.

Prodiskutovat projekt

Přečtěte si také