Kotlin Academy · Lektion

Udtømmende when

Dæk alle tilfælde

Lektion 4 af 413 trin

Udtømmende when er en gratis Kotlin Academy-lektion på CoddyKit. Dette er lektion 4 af 4. Du kan læse alle 3 lektioner i dette læringsspor gratis i deres fulde længde — derefter låser CoddyKit PRO alle lektioner op samt praktiske øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. Den er en del af læringsforløbet i Kotlin Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. Kotlin Academy-kurset indeholder 4 lektioner i alt.

Dæk alle tilfælde

Et udtømmende when håndterer alle mulige værdier. Når det bruges som udtryk, kræver Kotlin dette, så der altid produceres et resultat.

I denne lektion kan du se, hvordan du gør when udtømmende, og hvorfor det er nyttigt.

`else` gør det udtømmende

For åbne emner som Int dækker en else-gren alt, der ikke er angivet.

Det garanterer, at when altid finder et match.

fun label(n: Int): String = when (n) {
    0 -> "zero"
    1 -> "one"
    else -> "many"
}

fun main() {
    println(label(0))
    println(label(5))
}

Enumtyper muliggør udtømmende matchning

Med en enum ved compileren, hvilke værdier der er mulige. Angiv dem alle, så kan du udelade 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))
}

En enumværdi mangler

Hvis du glemmer en enumværdi i et when-udtryk, rapporterer compileren en fejl.

Det fanger fejl, så snart du tilføjer en ny enumkonstant.

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))
}

Forseglede klasser

En forseglet klasse har et fast sæt underklasser, som er kendt på kompileringstidspunktet.

Det gør det muligt for when at være udtømmende for alle undertyper uden 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)))
}

Derfor er udtømmende matchning nyttig

Et udtømmende when gør manglende tilfælde til kompileringsfejl i stedet for skjulte fejl.

Tilføj en ny underklasse eller enumværdi, så viser compileren alle de when-udtryk, du skal opdatere.

Sætninger kræver ikke udtømmende matchning

Når when bruges som en sætning og ikke tildeles, kræver det ikke udtømmende matchning.

For enums og forseglede typer er det dog stadig god praksis at dække alle tilfælde.

enum class Light { RED, GREEN }

fun main() {
    val light = Light.RED
    when (light) {
        Light.RED -> println("stop")
        Light.GREEN -> println("go")
    }
}

Kombination af sealed og data

Forseglede hierarkier bruger ofte underklasser, der er data klasser. Det giver dig både udtømmende matchning og intelligente casts, så du kan få adgang til egenskaber.

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` som sikkerhedsnet

Du kan stadig tilføje else til et when med en sealed type eller enum, men så holder compileren op med at advare om nye tilfælde.

Hvis du udelader else, bevarer du sikkerheden ved kompilering, så foretræk det for lukkede typer.

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 og lukkede emner

En Boolean har kun to værdier, så hvis du angiver dem begge, bliver when udtømmende uden else.

fun yesNo(flag: Boolean): String = when (flag) {
    true -> "yes"
    false -> "no"
}

fun main() {
    println(yesNo(true))
    println(yesNo(false))
}

Samlet overblik

Et udtømmende when betyder, at alle tilfælde er dækket:

  • else dækker åbne emner som Int
  • Enums, forseglede klasser og Boolean kan være udtømmende uden else
  • Compileren markerer manglende tilfælde, når du tilføjer nye
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))
}

Hurtig test

Test din forståelse af udtømmende when.

Opsamling

Du har lært, hvordan du gør when udtømmende:

  • else håndterer åbne emner
  • Enums, forseglede klasser og Boolean kan dækkes fuldstændigt
  • Tjek på kompileringstidspunktet fanger manglende tilfælde

Det afslutter kurset om When Expressions and Smart Casts.

Gratis at komme i gang

Lær Kotlin med en AI-underviser — gratis

Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.

Kurser
51
Lektioner
203

Ofte stillede spørgsmål

Er lektionen “Udtømmende when” gratis?

Ja — alle 3 lektioner i læringssporet Kotlin Academy, inklusive “Udtømmende when”, kan læses gratis i deres fulde længde her på webstedet. Derefter låser CoddyKit PRO alle lektioner op samt interaktive øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. Kotlin Academy-kurset indeholder 4 lektioner i alt.

Hvad lærer jeg i “Udtømmende when”?

Dæk alle tilfælde Du øver dig i Kotlin Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.

Skal jeg have erfaring for at begynde på Kotlin Academy?

Der kræves ingen tidligere erfaring. Kotlin Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 4 af 4.

Hvor lang tid tager lektionen “Udtømmende when”?

De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.

Kan jeg skrive og køre kode i denne Kotlin Academy-lektion?

Ja. Alle Kotlin Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.

Alle lektioner i dette kursus

  1. when som udtryk
  2. Smart casts
  3. Operatorerne is og as
  4. Udtømmende when
← Tilbage til Kotlin Academy