Sobes.tech
Middle

Kas yra 'sealed' klasės Kotlin ir kokiais atvejais jas naudoti?

sobes.tech AI

Atsakymas iš AI

sealed klasė naudojama ribotos klasės hierarchijos atvaizdavimui. Visi tiesioginiai sealed klasės paveldėtojai turi būti apibrėžti tame pačiame faile kaip ir pati sealed klasė arba to pačioje modulyje (kotlin 1.5+). Tai leidžia kompiliatoriui patikrinti, ar visi galimi pogrupiai yra apdoroti when išraiškoje, padarant ją pilną be else šakos.

Pagrindinės savybės:

  • Visi tiesioginiai pogrupiai turi būti lokalūs.
  • sealed klasės konstruktorius yra private pagal numatytuosius nustatymus.
  • sealed klasė negali būti abstrakti.
  • Negalima kurti egzempliorių.

Naudojimo atvejai:

  • Riboto būsenų ar rezultatų atvaizdavimas. Pavyzdžiui, Loading, Success(data), Error(message):
    sealed class Result<out T> {
       data class Success<T>(val data: T) : Result<T>()
       data class Error(val message: String) : Result<Nothing>()
       object Loading : Result<Nothing>()
    }
    
  • Rezultatų variantų apdorojimas when išraiškoje, garantuojant pilnumą:
    fun processResult(result: Result<String>) {
       when (result) {
          is Result.Success -> println("Gauti duomenys: ${result.data}")
          is Result.Error -> println("Klaida: ${result.message}")
          Result.Loading -> println("Įkeliamas...")
       }
       // Nereikia `else` šakos, nes kompiliatorius žino visus pogrupius.
    }
    
  • Naudojimas kaip enumų ekvivalentas su duomenų inkapsuliacija kiekviename variante:

Palyginimas su enum klasėmis:

Savybė enum class sealed class
Pavyzdžiai Ribotas vardintų konstantų rinkinys Ribotas tipų rinkinys
Duomenys variantuose Ne (tik savybės) Taip (per pogrupius)
Abstraktūs nariai Ne Taip
Paveldėjimas Ne Taip, bet tik tame pačiame faile/modulyje