Sobes.tech
Middle

Pověz mi o datových třídách a uzavřených třídách v Kotlinu.

sobes.tech AI

Odpověď od AI

Datové třídy v Kotlinu se používají pro ukládání dat. Automaticky generují užitečné metody jako equals(), hashCode(), toString(), copy() a také komponenty pro destrukturalizaci.

// Příklad datové třídy
data class User(val name: String, val age: Int)

Sealed třídy se používají k reprezentaci omezené hierarchie tříd. Všechny podtřídy musí být definovány ve stejném souboru jako sealed třída (v Kotlinu 1.5+ je toto omezení zmírněno). To umožňuje kompilátoru zajistit úplnost při kontrole podtříd, například v výrazu when.

// Příklad sealed třídy
sealed class Result {
    data class Success(val data: String) : Result()
    data class Error(val message: String) : Result()
    object Loading : Result()
}

// Příklad použití sealed třídy v `when`
fun processResult(result: Result) {
    when (result) {
        is Result.Success -> println("Úspěch: ${result.data}")
        is Result.Error -> println("Chyba: ${result.message}")
        Result.Loading -> println("Načítání...")
    }
}

Hlavní rozdíly:

  • Účel: datové třídy - ukládání dat, sealed třídy - omezení hierarchie tříd.
  • Generované metody: datové třídy generují standardní metody pro data, sealed třídy - ne.
  • Omezení podtříd: sealed třídy kladou omezení na deklaraci podtříd, datové třídy - ne.
  • Úplnost v when: Kotlin kompilátor může zkontrolovat úplnost podtříd sealed třídy v when bez větve else.

Obě třídy, sealed i datové, mohou být abstraktní, avšak datové třídy nemohou být open (protože jsou implicitně final) a nemohou přímo implementovat open metody (pouze přes rozhraní nebo abstraktní třídy). Sealed třídy jsou implicitně abstraktní a jejich konstruktory jsou soukromé.