La construcción when en Kotlin es una herramienta poderosa para controlar el flujo de ejecución del programa, que ha reemplazado al tradicional switch-case de Java. when se introdujo para aumentar la expresividad, reducir el código boilerplate y mejorar la seguridad de tipos.
En Java, la construcción switch-case está limitada a ciertos tipos (enum, int, String). A diferencia de Java, los desarrolladores de Kotlin buscaron simplificar las ramificaciones condicionales, haciéndolas más expresivas y seguras.
Las limitaciones de switch-case en Java dificultan la expansión y el mantenimiento del código, especialmente al trabajar con colecciones, comparando rangos o manejando diferentes tipos.
La construcción when en Kotlin es universal: funciona como una expresión (puede devolver un valor), admite verificaciones de condiciones, rangos, valores individuales, tipos y combinación de condiciones.
fun describe(obj: Any): String = when (obj) { 1 -> "Uno" in 2..10 -> "De dos a diez" is String -> "Cadena con longitud ${obj.length}" else -> "Desconocido" } val res1 = describe(1) // "Uno" val res2 = describe(5) // "De dos a diez" val res3 = describe("Kotlin") // "Cadena con longitud 6" val res4 = describe(42.0) // "Desconocido"
¿Puede usarse when sin argumento?
Sí, when puede ser utilizado como un reemplazo de una larga cadena de if-else si no es necesario comprobar el valor de una variable específica.
when { x < 0 -> println("Negativo") x == 0 -> println("Cero") else -> println("Positivo") }
¿Es obligatorio el bloque else en la construcción when?
El bloque else no es obligatorio si se han manejado todos los casos posibles, por ejemplo, para un enum o una clase sellada. Pero si hay una posibilidad de un caso no cubierto, else es obligatorio para evitar errores en tiempo de compilación.
sealed class Fruit object Apple : Fruit() object Pear : Fruit() fun check(f: Fruit): String = when (f) { Apple -> "Es una manzana" Pear -> "Es una pera" // No hay bloque else y el compilador no se queja: todos los casos están considerados }
¿Se pueden usar varios valores en una rama de when?
Sí, varios valores se pueden combinar mediante comas.
when (value) { 0, 1 -> println("Cero o Uno") else -> println("Otro") }
En un sistema de pago, se utiliza switch-case para determinar el estado de la operación. Al agregar un nuevo tipo de estado, olvidaron actualizar el switch. Un estado no manejado conduce a un error silencioso.
Ventajas:
Desventajas:
En Kotlin, se utiliza una clase sellada para los estados y la construcción when para manejarlos. Al agregar un nuevo estado, el compilador requiere que se agregue el manejo de nuevo caso.
Ventajas:
Desventajas: