De when-constructie in Kotlin is een krachtig hulpmiddel voor het beheren van de programmastroom, dat de traditionele switch-case uit Java vervangt. when is geïntroduceerd om de expressiviteit te vergroten, boilerplate-code te verminderen en typeveiligheid te verbeteren.
In Java is de switch-case-constructie beperkt tot bepaalde types (enum, int, String). In tegenstelling tot Java streefden Kotlin-ontwikkelaars ernaar om voorwaardelijke vertakkingen te vereenvoudigen, zodat ze expressiever en veiliger zijn.
De beperkingen van switch-case in Java bemoeilijken het uitbreiden en onderhouden van code, vooral bij het werken met collecties, het vergelijken van bereiken of het verwerken van verschillende types.
De when-constructie in Kotlin is veelzijdig: het werkt als een expressie (kan een waarde retourneren), ondersteunt conditionele controles, bereiken, afzonderlijke waarden, types en de combinatie van voorwaarden.
fun beschrijven(obj: Any): String = when (obj) { 1 -> "Één" in 2..10 -> "Van twee tot tien" is String -> "String met lengte ${obj.length}" else -> "Onbekend" } val res1 = beschrijven(1) // "Één" val res2 = beschrijven(5) // "Van twee tot tien" val res3 = beschrijven("Kotlin") // "String met lengte 6" val res4 = beschrijven(42.0) // "Onbekend"
Kan when zonder argument worden gebruikt?
Ja, when kan worden gebruikt als vervanging voor een lange keten van if-else, als er geen behoefte is om een specifieke variabele te controleren.
when { x < 0 -> println("Negatief") x == 0 -> println("Nul") else -> println("Positief") }
Is de else-blok verplicht in de when-constructie?
De else-blok is niet verplicht als alle mogelijke gevallen zijn afgehandeld, bijvoorbeeld voor enum of sealed class. Maar als er een kans is op een niet-afgedekt geval, is else verplicht om compileerfouten te voorkomen.
sealed class Fruit object Apple : Fruit() object Pear : Fruit() fun controleer(f: Fruit): String = when (f) { Apple -> "Het is een appel" Pear -> "Het is een peer" // Geen else-blok, en de compiler geeft geen fout — alle opties zijn overwogen }
Kun je in when meerdere waarden in één tak gebruiken?
Ja, meerdere waarden kunnen worden samengevoegd met een komma.
when (waarde) { 0, 1 -> println("Zero of One") else -> println("Overige") }
In een betalingsysteem wordt switch-case gebruikt om de status van een transactie te bepalen. Bij het toevoegen van een nieuw type status werd vergeten de switch bij te werken. Een onbehandelde status leidt tot een stille fout.
Voordelen:
Nadelen:
In Kotlin wordt een sealed class gebruikt voor statussen en de when-constructie voor hun verwerking. Bij het toevoegen van een nieuwe status vereist de compiler dat de verwerking van de nieuwe case wordt toegevoegd.
Voordelen:
Nadelen: