La costruzione when in Kotlin è uno strumento potente per controllare il flusso di esecuzione del programma, che ha sostituito il tradizionale switch-case di Java. when è stata introdotta per aumentare l'espressività, ridurre il boilerplate e migliorare la sicurezza dei tipi.
In Java, la costruzione switch-case è limitata a determinati tipi (enum, int, String). A differenza di Java, i programmatori Kotlin hanno cercato di semplificare i rami condizionali, rendendoli più espressivi e sicuri.
Le limitazioni dello switch-case in Java rendono difficile espandere e manutenere il codice, specialmente quando si lavora con collezioni, confronto di intervalli o gestione di diversi tipi.
La costruzione when in Kotlin è universale: funziona come un'espressione (può restituire un valore), supporta controlli di condizioni, intervalli, valori singoli, tipi e combinazione di condizioni.
fun describe(obj: Any): String = when (obj) { 1 -> "One" in 2..10 -> "From two to ten" is String -> "String with length ${obj.length}" else -> "Unknown" } val res1 = describe(1) // "One" val res2 = describe(5) // "From two to ten" val res3 = describe("Kotlin") // "String with length 6" val res4 = describe(42.0) // "Unknown"
Può essere usato when senza argomento?
Sì, when può essere usato come sostituto di una lunga catena di if-else, se non è necessario controllare il valore di una variabile specifica.
when { x < 0 -> println("Negative") x == 0 -> println("Zero") else -> println("Positive") }
È obbligatorio il blocco else nella costruzione when?
Il blocco else non è obbligatorio se tutti i possibili casi sono stati trattati, ad esempio, per enum o sealed class. Ma se c'è la possibilità di un caso non trattato, else è obbligatorio per evitare errori di compilazione.
sealed class Fruit object Apple : Fruit() object Pear : Fruit() fun check(f: Fruit): String = when (f) { Apple -> "It's an apple" Pear -> "It's a pear" // Nessun blocco else, e il compilatore non si lamenta — tutti i casi sono coperti }
È possibile utilizzare più valori in un singolo ramo di when?
Sì, più valori possono essere combinati con una virgola.
when (value) { 0, 1 -> println("Zero or One") else -> println("Other") }
In un sistema di pagamento, switch-case è utilizzato per determinare lo stato dell'operazione. Quando è stato aggiunto un nuovo tipo di stato, si è dimenticato di aggiornare lo switch. Uno stato non gestito porta a un silent-error.
Pro:
Contro:
In Kotlin, si utilizza una sealed class per gli stati e la costruzione when per gestirli. Quando viene aggiunto un nuovo stato, il compilatore richiede di aggiungere la gestione del nuovo caso.
Pro:
Contro: