Sobes.tech
Middle

Papaskink apie duomenų klases ir sealed klases Kotlin'e.

sobes.tech AI

Atsakymas iš AI

Kotlin kalbos duomenų klasės naudojamos duomenų saugojimui. Jos automatiškai generuoja naudingus metodus equals(), hashCode(), toString(), copy(), taip pat destrukcijos komponentus.

// Duomenų klasės pavyzdys
data class User(val name: String, val age: Int)

Sealed klasės naudojamos ribotos klasės hierarchijos atstovavimui. Visos pogrupės turi būti apibrėžtos tame pačiame faile kaip ir pati sealed klasė (nuo Kotlin 1.5+ ši apribojimas yra sumažintas). Tai leidžia kompiliatoriui įsitikinti, kad visi pogrupiai yra aprašyti, pavyzdžiui, when išraiškoje.

// Sealed klasės pavyzdys
sealed class Result {
    data class Success(val data: String) : Result()
    data class Error(val message: String) : Result()
    object Loading : Result()
}

// Pavyzdys, kaip naudoti sealed klasę `when` išraiškoje
fun processResult(result: Result) {
    when (result) {
        is Result.Success -> println("Sėkmė: ${result.data}")
        is Result.Error -> println("Klaida: ${result.message}")
        Result.Loading -> println("Kraunasi...")
    }
}

Pagrindiniai skirtumai:

  • Paskirtis: duomenų klasės - duomenų saugojimas, sealed klasės - klasės hierarchijos apribojimas.
  • Generuojami metodai: duomenų klasės generuoja standartinius duomenų metodus, sealed klasės - ne.
  • Pogrupių apribojimas: sealed klasės taiko apribojimus pogrupių deklaravimui, duomenų klasės - ne.
  • when išsamus patikrinimas: Kotlin kompiliatorius gali patikrinti, ar visi pogrupiai yra aprašyti when išraiškoje be else dalies.

Abi, sealed ir duomenų klasės, gali būti abstrakčios, tačiau duomenų klasės negali būti open (nes jos pagal nutylėjimą yra finalinės) ir tiesiogiai neįgyvendina open metodų (tik per sąsajas ar abstrakčias klases). Sealed klasės pagal nutylėjimą yra abstrakčios, ir jų konstruktoriai yra privačios.