Kotlin switch-case: ¿cómo funciona when bajo el capó? Guía completa

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

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


3.2. Rangos y colecciones

                

Blogs

Book Recommendations