Kompletny when
Uwzględniaj wszystkie przypadki
Kompletny when to bezpłatna lekcja Kotlin Academy na CoddyKit. To lekcja 4 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.
Obsługa wszystkich przypadków
Wyczerpujące wyrażenie when obsługuje każdą możliwą wartość. Gdy jest używane jako wyrażenie, Kotlin wymaga tego, aby zawsze został utworzony wynik.
W tej lekcji pokazano, jak sprawić, by when było wyczerpujące, oraz dlaczego jest to pomocne.
else zapewnia wyczerpujące dopasowanie
W przypadku typów o otwartym zbiorze wartości, takich jak Int, gałąź else obejmuje wszystko, czego nie wymieniono.
Gwarantuje to, że when zawsze znajdzie dopasowanie.
fun label(n: Int): String = when (n) {
0 -> "zero"
1 -> "one"
else -> "many"
}
fun main() {
println(label(0))
println(label(5))
}Enumy umożliwiają wyczerpujące dopasowanie
W przypadku enuma kompilator zna każdą możliwą wartość. Wymień je wszystkie, a można pominąć else.
enum class Direction { NORTH, SOUTH, EAST, WEST }
fun turn(d: Direction): String = when (d) {
Direction.NORTH -> "up"
Direction.SOUTH -> "down"
Direction.EAST -> "right"
Direction.WEST -> "left"
}
fun main() {
println(turn(Direction.EAST))
}Pominięta wartość enuma
Jeśli w wyrażeniu when pominie się wartość enuma, kompilator zgłosi błąd.
Pozwala to wykryć błędy natychmiast po dodaniu nowej stałej enuma.
enum class Status { ACTIVE, PAUSED, STOPPED }
fun describe(s: Status): String = when (s) {
Status.ACTIVE -> "running"
Status.PAUSED -> "paused"
Status.STOPPED -> "stopped"
}
fun main() {
println(describe(Status.PAUSED))
}Klasy sealed
Klasa sealed ma stały zbiór podklas znany w czasie kompilacji.
Dzięki temu when może obejmować wszystkie podtypy bez użycia else.
sealed class Shape
class Circle(val r: Double) : Shape()
class Square(val s: Double) : Shape()
fun area(shape: Shape): Double = when (shape) {
is Circle -> 3.14159 * shape.r * shape.r
is Square -> shape.s * shape.s
}
fun main() {
println(area(Square(4.0)))
}Dlaczego wyczerpujące dopasowanie pomaga
Wyczerpujące when zamienia brakujące przypadki w błędy kompilacji zamiast w niezauważone błędy.
Po dodaniu nowej podklasy lub wartości enuma kompilator wskaże każde wyrażenie when, które należy zaktualizować.
Instrukcje nie muszą być wyczerpujące
Gdy when jest używane jako instrukcja (a nie przypisywane do zmiennej), nie musi obejmować wszystkich przypadków.
Jednak w przypadku enumów i typów sealed i tak warto uwzględniać wszystkie przypadki.
enum class Light { RED, GREEN }
fun main() {
val light = Light.RED
when (light) {
Light.RED -> println("stop")
Light.GREEN -> println("go")
}
}Połączenie sealed i data
Hierarchie sealed często korzystają z podklas typu data class, co zapewnia wyczerpujące dopasowanie oraz inteligentne rzutowania umożliwiające dostęp do właściwości.
sealed class Result
data class Ok(val value: Int) : Result()
data class Err(val message: String) : Result()
fun show(r: Result): String = when (r) {
is Ok -> "ok: " + r.value
is Err -> "error: " + r.message
}
fun main() {
println(show(Ok(42)))
println(show(Err("boom")))
}else jako siatka bezpieczeństwa
Można nadal dodać else do wyrażenia when dla typu sealed lub enuma, ale wtedy kompilator przestanie ostrzegać o nowych przypadkach.
Pominięcie else zachowuje bezpieczeństwo podczas kompilacji, dlatego w przypadku typów zamkniętych warto preferować takie rozwiązanie.
enum class Coin { HEADS, TAILS }
fun flip(c: Coin): Int = when (c) {
Coin.HEADS -> 1
Coin.TAILS -> 0
}
fun main() {
println(flip(Coin.HEADS))
}Boolean i zamknięte typy
Boolean ma tylko dwie wartości, więc wymienienie obu pozwala uzyskać wyczerpujące when bez użycia else.
fun yesNo(flag: Boolean): String = when (flag) {
true -> "yes"
false -> "no"
}
fun main() {
println(yesNo(true))
println(yesNo(false))
}Podsumowanie
Wyczerpujące when oznacza, że uwzględniono wszystkie przypadki:
elseobejmuje otwarte typy, takie jakInt- Enumy, klasy sealed i
Booleanmogą być wyczerpujące bez użyciaelse - Kompilator sygnalizuje brakujące przypadki po dodaniu nowych
sealed class Event
object Start : Event()
object Stop : Event()
fun handle(e: Event): String = when (e) {
is Start -> "starting"
is Stop -> "stopping"
}
fun main() {
println(handle(Start))
println(handle(Stop))
}Szybkie sprawdzenie
Proszę sprawdzić zrozumienie wyczerpującego wyrażenia when.
Powtórzenie
Nauczyli się Państwo, jak uzyskać wyczerpujące when:
elseobsługuje otwarte typy- Enumy, klasy sealed i
Booleanmogą być w pełni uwzględnione - Sprawdzanie podczas kompilacji wykrywa brakujące przypadki
To kończy kurs Wyrażenia When i inteligentne rzutowania.
Ucz się Kotlin dzięki korepetycjom AI — za darmo
Pisz i uruchamiaj kod w przeglądarce, otrzymuj natychmiastową pomoc od korepetytora AI dostępnego 24/7 i kontynuuj naukę w sieci lub w aplikacji.
- Kursy
- 51
- Lekcje
- 203
Często zadawane pytania
Czy lekcja „Kompletny when” jest bezpłatna?
Tak — pełny tekst „Kompletny when” 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 „Kompletny when”?
Uwzględniaj wszystkie przypadki Ć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 4 z 4.
Ile czasu zajmuje lekcja „Kompletny when”?
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
- when jako wyrażenie
- Smart casty
- Operatory is i as
- Kompletny when