ProgrammazioneSviluppatore Kotlin

Che cos'è la costruzione when in Kotlin, come funziona, in cosa differisce da switch-case in Java e quali possibilità offre per gestire diverse situazioni? Fornisci esempi di vari casi d'uso.

Supera i colloqui con l'assistente IA Hintsage

Risposta.

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.

Storia della domanda

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.

Problema

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.

Soluzione

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.

Esempio di codice:

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"

Caratteristiche principali:

  • Possibilità di lavorare sia con espressioni che con operatori.
  • Verifica per valore, tipo, intervallo e condizioni complesse.
  • Garanzia di sicurezza nella gestione di tutte le varianti (ad esempio, con classi sealed).

Domande trabocchetto.

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

Errori tipici e anti-pattern

  • Omessa la parte else in caso di varianti incomplete (può portare a errori di runtime).
  • Sovraccarico di when con rami troppo complessi (compromettendo la leggibilità).
  • Utilizzo di when solo come switch-case, senza applicare controlli di tipo e intervallo.

Esempio dalla vita reale

Caso negativo

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:

  • Implementazione rapida delle modifiche con un numero ridotto di stati.

Contro:

  • Nessuna garanzia che tutti gli stati siano considerati.
  • Silent-error impliciti quando appaiono nuovi valori.

Caso positivo

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:

  • Gestione sicura di tutti gli stati.
  • Errore di compilazione in caso di omissione di un caso.

Contro:

  • Necessità di un'attenta aggiornamento della sealed class quando si espande il sistema.