Sobes.tech
Middle

Ce sunt clasele 'sealed' în Kotlin și în ce cazuri trebuie utilizate?

sobes.tech AI

Răspuns de la AI

Clasa sealed este utilizată pentru a reprezenta o ierarhie limitată de clase. Toți subtipurile directe ale unei clase sealed trebuie să fie definite în același fișier cu clasa sealed sau în aceleași module (pentru Kotlin 1.5+). Acest lucru permite compilatorului să verifice dacă toate subtipurile posibile sunt tratate într-o expresie when, făcând-o exhaustivă fără a fi nevoie de o ramură else.

Caracteristici cheie:

  • Toate subclasele directe trebuie să fie locale.
  • Constructorul clasei sealed este private implicit.
  • Clasa sealed nu poate fi abstractă.
  • Nu permite crearea de instanțe.

Cazuri de utilizare:

  • Reprezentarea unui set limitat de stări sau rezultate. De exemplu, 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>()
    }
    
  • Tratarea variantelor într-o expresie when cu garanție de exhaustivitate.
    fun processResult(result: Result<String>) {
       when (result) {
          is Result.Success -> println("Date primite: ${result.data}")
          is Result.Error -> println("Eroare: ${result.message}")
          Result.Loading -> println("Se încarcă...")
       }
       // Nu este nevoie de o ramură `else`, deoarece compilatorul cunoaște toate subtipurile.
    }
    
  • Utilizare ca echivalent al enumerărilor cu posibilitatea de a încapsula date în fiecare variantă.

Comparație cu clasele enum:

Caracteristică enum class sealed class
Instanțe Set limitat de constante denumite Set limitat de tipuri
Date în variante Nu (doar proprietăți) Da (prin subclase)
Membri abstracti Nu Da
Moștenire Nu Da, dar limitată la același fișier/modul