Introducción: ¿Adiós switch-case? ¡Bienvenido when!
Si vienes a Kotlin desde el mundo de Java, C# o JavaScript, lo primero que probablemente buscas es el conocido operador switch-case. Y aquí te espera una sorpresa: en Kotlin no existe el switch-case clásico. En su lugar, el lenguaje ofrece una herramienta mucho más potente y flexible: when.
En Stack Overflow, la pregunta "How to implement switch-case statement in Kotlin" acumula miles de visitas. Es normal: los desarrolladores se acostumbran a ciertas construcciones y quieren encontrar sus equivalentes. Pero la verdad es que when en Kotlin no es solo un reemplazo de switch. Es su evolución, que bajo el capó funciona de manera más inteligente y rápida.
En este artículo no solo mostraremos cómo escribir when. Nos adentraremos bajo el capó: descubriremos en qué se compila tu código, por qué es más rápido que switch en algunos escenarios y cómo usar when al 100%.
1. Sintaxis básica: de switch-case a when
Para empezar, el ejemplo más simple. Imaginemos que tenemos la clásica construcción de Java:
// Javaint day = 3;String dayName;switch (day) { case 1: dayName = "Lunes"; break; case 2: dayName = "Martes"; break; case 3: dayName = "Miércoles"; break; default: dayName = "Día desconocido";}En Kotlin se vería así:
// Kotlinval day = 3val dayName = when (day) { 1 -> "Lunes" 2 -> "Martes" 3 -> "Miércoles" else -> "Día desconocido"}Ya aquí se ven dos ventajas principales:
- Sin break — Kotlin sale automáticamente del bloque después de ejecutar la rama.
- Devuelve un valor — se puede asignar el resultado a una variable.
2. Cómo funciona when bajo el capó: bytecode y optimización
Ahora lo más interesante. Cuando escribes when, el compilador de Kotlin analiza tus condiciones y elige la forma óptima de ejecución. Echemos un vistazo al bytecode (aproximadamente, sin detalles innecesarios).
Caso 1: when con constantes (como switch-case)
Si usas when con números enteros, cadenas o constantes enum, el compilador genera una tabla de saltos (tableswitch o lookupswitch). Es el mismo mecanismo que usa Java para switch-case. La diferencia es que Kotlin lo hace automáticamente, sin tu intervención.
Caso 2: when con cualquier condición
Si escribes algo como:
when (x) { in 1..10 -> "Pequeño" in 11..100 -> "Mediano" else -> "Grande"}El compilador no puede usar una tabla de saltos. Genera una cadena de if-else. Pero Kotlin lo hace de la manera más eficiente posible: las condiciones se verifican en orden y, en cuanto se encuentra una coincidencia, la ejecución se detiene.
Caso 3: when sin argumento
Esto es magia aparte. Si escribes:
when { x > 0 -> "Positivo" x < 0 -> "Negativo" else -> "Cero"}El compilador lo convierte en if-else comunes. Pero la sintaxis es mucho más limpia que los if anidados.
Conclusión: Kotlin no solo copia switch-case. Elige inteligentemente entre una tabla de saltos e if-else para que tu código funcione lo más rápido posible.
3. Capacidades avanzadas de when: lo que switch no tiene
when puede hacer mucho más que simplemente comparar valores. Aquí tienes algunas funciones killer:
3.1. Verificación de tipos (smart cast)
fun describe(obj: Any): String = when (obj) { is String -> "Cadena de longitud ${obj.length}" // smart cast a String is Int -> "Número entero" is List<*> -> "Lista de ${obj.size} elementos" else -> "Tipo desconocido"}