0Pricing
Kotlin Academy · Lekcja

sealed class a sealed interface: kiedy używać każdej z nich

Poznaj różnicę między klasami sealed a interfejsami sealed w Kotlinie.

sealed class a sealed interface: kiedy używać każdej z nich to bezpłatna lekcja Kotlin Academy na CoddyKit. To lekcja 1 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Kotlin Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Kotlin Academy zawiera 4 lekcji w sumie.

Typy sealed w Kotlinie

Klasy i interfejsy sealed ograniczają hierarchię klas do znanego zbioru podtypów, umożliwiając wyczerpujące wyrażenia when.

Podstawy sealed class

sealed class ogranicza dziedziczenie do tego samego pakietu (Kotlin 1.5+) albo tego samego pliku.
sealed class Shape
class Circle(val radius: Double) : Shape()
class Rectangle(val w: Double, val h: Double) : Shape()
object Unknown : Shape()

sealed interface: większa elastyczność

sealed interface pozwala podtypom jednocześnie rozszerzać inne klasy ORAZ implementować inne interfejsy — sealed class nie daje takiej możliwości.
sealed interface Result<out T>
data class Success<T>(val value: T) : Result<T>
data class Error(val ex: Exception) : Result<Nothing>

Najważniejsze różnice

sealed class: podklasy mogą mieć konstruktory i stan. sealed interface: podtypy mogą rozszerzać dowolną klasę. Należy używać sealed interface, gdy potrzebna jest większa elastyczność.
// sealed class subtype extends another class:
sealed interface Command
class MoveCommand(val dx: Int, val dy: Int) : Command, Serializable
class ResizeCommand(val scale: Double) : Command, Cloneable

Wyczerpujące when: else nie jest potrzebne

Gdy uwzględniono wszystkie podtypy sealed, wyrażenie when jest wyczerpujące — else nie jest potrzebne, a kompilator wymusza kompletność.
fun area(shape: Shape): Double = when (shape) {
    is Circle -> Math.PI * shape.radius * shape.radius
    is Rectangle -> shape.w * shape.h
}  // no 'else' — compiler guarantees completeness

Dodanie podtypu przerywa istniejące when

Po dodaniu nowego podtypu sealed istniejące wyrażenia when przestaną się kompilować, dopóki nie zostaną zaktualizowane. To główna korzyść.
// Add Triangle to Shape:
class Triangle(val base: Double, val height: Double) : Shape()
// Now the area() function above won't compile until
// a Triangle branch is added — safety net!

Klasy sealed ze wspólnymi właściwościami

Wspólne właściwości należy deklarować w sealed class.
sealed class NetworkResult {
    abstract val timestamp: Long
}
data class SuccessResult(val data: String, override val timestamp: Long) : NetworkResult()
data class FailureResult(val error: String, override val timestamp: Long) : NetworkResult()

Zagnieżdżone typy sealed

Podtypy sealed również mogą być sealed, co pozwala tworzyć hierarchie wielopoziomowe.
sealed interface UiState
object Loading : UiState
sealed interface Loaded : UiState
data class Content(val items: List<String>) : Loaded
data class Empty(val hint: String) : Loaded
data class Failure(val error: String) : UiState

Podtypy object dla wariantów bez stanu

Należy używać object dla podtypów sealed, które nie przechowują stanu.
sealed class Direction
object North : Direction()
object South : Direction()
object East : Direction()
object West : Direction()

fun move(d: Direction) = when (d) {
    North -> y++
    South -> y--
    East -> x++
    West -> x--
}

sealed + data class + object razem

Pod jednym typem sealed można łączyć data class (dla podtypów przechowujących stan) i object (dla singletonów).
sealed class LoadState
object Idle : LoadState()
object Loading : LoadState()
data class Success(val count: Int) : LoadState()
data class Error(val msg: String) : LoadState()

Kiedy wybrać sealed class, a kiedy interface

Należy używać sealed class, gdy wszystkie podtypy współdzielą wspólny stan. Należy używać sealed interface, gdy podtypy muszą rozszerzać różne klasy bazowe lub implementować inne interfejsy.

Szybkie sprawdzenie

Jaką przewagę nad sealed class ma sealed interface?

Podsumowanie

sealed class/interface ogranicza hierarchię do znanych typów. when dla sealed jest wyczerpujące — else nie jest potrzebne. sealed interface pozwala podtypom rozszerzać inne klasy. Dla podtypów przechowujących stan należy używać data class, a dla bezstanowych — object.

Często zadawane pytania

Czy lekcja „sealed class a sealed interface: kiedy używać każdej z nich” jest bezpłatna?

Tak — pełny tekst „sealed class a sealed interface: kiedy używać każdej z nich” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Kotlin Academy, przejdź na CoddyKit PRO. Kurs Kotlin Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „sealed class a sealed interface: kiedy używać każdej z nich”?

Poznaj różnicę między klasami sealed a interfejsami sealed w Kotlinie. Ćwiczysz Kotlin Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć Kotlin Academy?

Nie wymagamy żadnego doświadczenia. Kotlin Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 1 z 4.

Ile czasu zajmuje lekcja „sealed class a sealed interface: kiedy używać każdej z nich”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji Kotlin Academy?

Tak. Każda lekcja Kotlin Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. sealed class a sealed interface: kiedy używać każdej z nich
  2. Kompletne when z hierarchiami sealed
  3. Modelowanie stanu interfejsu za pomocą klas sealed
  4. Zagnieżdżanie i łączenie hierarchii sealed
← Powrót do Kotlin Academy