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 wwhenbez konieczności użycia gałęzielse.
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.