Función WHEN Kotlin

Jorge Rodriguez
2 min readNov 14, 2017

--

La mejor definición que escuché para esta función fue: Es un “switch” con esteroides!.

Me pareció gracioso al inicio, pero quien me lo dijo tiene toda la razón.

Si alguna vez tuviste la necesidad de usar un switch, sabes que solo puedes usar un tipo específico de dato, si te olvidas de un break, se desatan la primera, segunda y tercera guerra mundial en tu código. Esta función es tan poderosa, que permite reemplazar desde el más básico hasta el más complejo caso de una función “if/else”. Empecemos con un problema que a la mayoría de desarrolladores les debe haber pasado alguna vez, con el fin de “refactorizar” nuestro código para hacerlo re-utilizable. Creamos una función que reciba un objeto padre, y dentro de la función vemos cada caso para ver con cual de sus hijos hacer match, y ver como tratarlo (un ejemplo que se me viene a la cabeza, es hablando de Android, cuando tienes varios view holders dentro de un adapter, para pintar un recycler view).

public void metodo1(ObjetoPadre objeto){  if(objeto instanceof ObjetoHijo1){///logica complicada}
else if(objeto instanceof ObjetoHijo2){///logica complicada}
else if(objeto instanceof ObjetoHijoN){///esta era fácil}
}

Este caso se vería simplificado con la función when, así:

fun metodo1(objeto){  is ObjetoHijo1 ->///logica complicada
is ObjetoHijo2 ->///logica complicada
is ObjetoHijoN ->///logica complicada
}

Yay!! Ok pues ahora puedes imaginar más funcionalidades? Imagínate en un contexto Android, en el cual quieres realizar una acción según la vista que recibes, tendríamos algo así:

when (view) {  is EditText -> toast(view.text)
is TextView -> toast(view.text)
is Checkbox-> toast("Current selection: ${view.checked}")
else -> toast("Comportamiento por defecto para las otras vistas.")
}

Aquí se agrega algo más que es el “else”, cumple la misma función que el default, es decir que en ese bloque, se agrega el código que deberían cumplir los casos no controlados.

Aún no te emocionas? Pues bueno, tengo una opción más:

val text = when  {  s.contains("fifa") -> "es un gamer!"
x > 599 -> "es muy caro!"
v is EditText -> "Estamos editando el texto!"
else -> ""
}

El lado izquierdo de las funciones pueden hacer lo que sea, así que úsalo, donde puedas! Es una función que permite hacer casi de todo, así tus flujos de control se verán mucho más organizados.

Recuerda, tu feedback es bienvenido.

Espero que te haya gustado. Y te sirva en adelante.

--

--

Jorge Rodriguez

Thoughtworker, me encanta programar y me gusta mucho Android! Apasionado por compartir y generar conocimiento en español.