Sobes.tech
Middle

Ar pažįsti sealed klases ir kuo jos išsiskiria?

sobes.tech AI

Atsakymas iš AI

Taip, pažįstu.

sealed klasių ypatybė ta, kad jos leidžia apriboti paveldėjimo hierarchiją. Visi tiesioginiai sealed klasės pogrupiai turi būti deklaruoti tame pačiame faile. Tai užtikrina, kad kompiliatorius žino visus galimus pogrupius, kas naudinga when išraiškų pilnumo patikrinimui.

Pavyzdys:

sealed class Result {
    data class Success(val message: String) : Result()
    data class Error(val code: Int, val description: String) : Result()
    object Loading : Result() // Singleton būsenos įkėlimo
}

fun processResult(result: Result) {
    when (result) {
        is Result.Success -> println("Sėkmė: ${result.message}")
        is Result.Error -> println("Klaida ${result.code}: ${result.description}")
        Result.Loading -> println("Įkeliama...")
        // Nereikia else, nes kompiliatorius žino visas galimas parinktis
    }
}

Privalumai:

  • Saugumas: Garantuoja when išraiškų pilnumą be else.
  • Aiškumas: Aiškiai nurodo ribotą galimų būsenų ar pogrupių rinkinį.
  • Kontrolė: Užkerta kelią nevaldomai paveldėjimui iš išorės.

Skirtumas nuo enum class: sealed klasės gali turėti skirtingus duomenų tipus kiekvienam pogrupiui (pavyzdžiui, Success ir Error), tuo tarpu enum class elementai yra statiniai ir gali turėti tik tam tikras savybes, bendras visiems. sealed klasės taip pat gali turėti objektų pavyzdžius (Loading).