ProgramaciónDesarrollador de Kotlin

¿Qué es la construcción when en Kotlin, cómo funciona, en qué se diferencia de switch-case en Java y qué posibilidades ofrece para manejar diversas situaciones? Proporcione ejemplos de diferentes casos de uso.

Supere entrevistas con el asistente de IA Hintsage

Respuesta.

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.

Historia del tema

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.

Problema

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.

Solución

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.

Ejemplo de código:

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"

Características clave:

  • Posibilidad de trabajar tanto con expresiones como con operadores.
  • Verificación por valor, tipo, rango y condiciones complejas.
  • Garantiza seguridad al manejar todas las variantes (por ejemplo, con clases sealed).

Preguntas trampa.

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

Errores típicos y anti-patrones

  • Omitir el bloque else en opciones incompletas (puede llevar a errores en tiempo de ejecución).
  • Sobrecargar when con ramas demasiado complejas (viola la legibilidad).
  • Usar when solo como switch-case, sin aplicar verificaciones de tipos y rangos.

Ejemplo de la vida real

Caso negativo

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:

  • Implementación rápida de cambios con un número pequeño de estados.

Desventajas:

  • No hay garantía de que todos los estados estén considerados.
  • Errores silenciosos no explícitos al aparecer nuevos valores.

Caso positivo

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:

  • Manejo seguro de todos los estados.
  • Error de compilación al omitir un caso.

Desventajas:

  • Necesidad de actualizar cuidadosamente la clase sellada al ampliar el sistema.