Sobes.tech
Middle

Opowiedz o klasach danych i klasach zamkniętych w Kotlin.

sobes.tech AI

Odpowiedź od AI

Klasy danych w Kotlinie służą do przechowywania danych. Automatycznie generują przydatne metody, takie jak equals(), hashCode(), toString(), copy(), a także komponenty do destrukturyzacji.

// Przykład klasy danych
data class User(val name: String, val age: Int)

Klasy sealed służą do reprezentowania ograniczonej hierarchii klas. Wszystkie podklasy muszą być zdefiniowane w tym samym pliku co klasa sealed (w Kotlin 1.5+ to ograniczenie zostało złagodzone). Pozwala to kompilatorowi na zapewnienie wyczerpującej obsługi podklas, na przykład w wyrażeniu when.

// Przykład klasy sealed
sealed class Result {
    data class Success(val data: String) : Result()
    data class Error(val message: String) : Result()
    object Loading : Result()
}

// Przykład użycia klasy sealed w wyrażeniu when
fun processResult(result: Result) {
    when (result) {
        is Result.Success -> println("Sukces: ${result.data}")
        is Result.Error -> println("Błąd: ${result.message}")
        Result.Loading -> println("Ładowanie...")
    }
}

Główne różnice:

  • Cel: klasy danych - przechowywanie danych, klasy sealed - ograniczenie hierarchii klas.
  • Metody generowane: klasy danych generują standardowe metody dla danych, klasy sealed - nie.
  • Ograniczenie podklas: klasy sealed nakładają ograniczenia na deklarację podklas, klasy danych - nie.
  • Wyczerpująca obsługa w when: kompilator Kotlin może sprawdzić wyczerpującą obsługę podklas klasy sealed w when bez konieczności użycia gałęzi else.

Zarówno klasy sealed, jak i klasy danych mogą być abstrakcyjne, jednak klasy danych nie mogą być open (ponieważ są domyślnie final) i nie mogą bezpośrednio implementować metod open (tylko przez interfejsy lub klasy abstrakcyjne). Klasy sealed są domyślnie abstrakcyjne, a ich konstruktory są prywatne.