Sobrecarga de operadores en Kotlin. Añade operaciones estándar a cualquier clase (KDA 17)
Antonio Leiva

En Kotlin, como en todo lenguaje, tenemos operadores predefinidos para realizar ciertas operaciones.

Los más típicos son la suma (+), resta (-), multiplicación (*) o división (/), pero hay unos cuantos más.

En algunos lenguajes, como en Java, estos operadores están limitados a ciertos tipos de datos, y no tenemos forma de hacer que otros tipos los utilicen.

Hay otros lenguajes como Scala en los que nos podemos inventar cualquier tipo de operador que se nos ocurra, ya que los nombres de las funciones aceptan cualquier símbolo.

En Kotlin se toma una solución intermedia: hay una serie de operadores predefinidos, pero los podemos sobrecargar para cualquier tipo de datos.

¿Te gustaría comenzar hoy a dar el siguiente paso? Te recomiendo que entres en mi training gratuito aquí.

Sobrecarga de operadores en Kotlin

Como hablábamos, en Kotlin se pueden sobrecargar cierto número de operadores, implementando la función correspondiente en nuestra clase. Esa función debe ser marcada con la palabra reservada operator.

Los operadores son básicamente los siguientes:

Operadores Unarios

+aa.unaryPlus()
-aa.unaryMinus()
!aa.not()
a++a.inc()
a–a.dec()

Operadores Binarios

a + ba.plus(b)
a – ba.minus(b)
a * ba.times(b)
a / ba.div(b)
a % ba.mod(b)
a..ba.rangeTo(b)
a in bb.contains(a)
a !in b!b.contains(a)
a += ba.plusAssign(b)
a -= ba.minusAssign(b)
a *= ba.timesAssign(b)
a /= ba.divAssign(b)
a %= ba.modAssign(b)

Operadores tipo array

a[i]a.get(i)
a[i, j]a.get(i, j)
a[i_1, …, i_n]a.get(i_1, …, i_n)
a[i] = ba.set(i, b)
a[i, j] = ba.set(i, j, b)
a[i_1, …, i_n] = ba.set(i_1, …, i_n, b)

Operación Equals

a == ba?.equals(b) ?: b === null
a != b!(a?.equals(b) ?: b === null)

Las operaciones equals son un poco diferentes, porque usan una traducción más compleja para hacer un chequeo correcto, y porque esperan una especificación exacta de la función, y no sólo un nombre específico para la misma. La función debe ser implementada exactamente así:

fun equals(other: Any?): Boolean

Invocación de funciones

a(i)a.invoke(i)
a(i, j)a.invoke(i, j)
a(i_1, …, i_n)a.invoke(i_1, …, i_n)

Un ejemplo

Imagina que tienes un modelo de datos que son compañías, cada una de las cuales tiene un listado de empleados.

Podrías utilizar el operador get para acceder a las posiciones mediante corchetes. La implementación es muy sencilla:

class Employee(val id: Long, val name: String)

class Company(private val employees: List) {
    operator fun get(pos: Int) = employees[pos]
}

Y así es como podrías usarlo:

val company = Company(listOf(Employee(1235, "John"), Employee(2584, "Mike")))
val mike = company[1]

Pero podrías ir más, allá, y usar el id para recuperar el valor, implementando la función así:

operator fun get(id: Long) = employees.first { it.id == id }

val mike = company[2584]

Conclusión

Los operadores nos pueden ayudar a dar mayor legibilidad utilizando símbolos comunes para operaciones conocidas.

Hay que tener cuidado con no utilizarlos en situaciones en las que pueda llevar a confusión a las personas que lo lean, pero se pueden convertir en una herramienta realmente interesante.

Si todo esto te apasiona tanto como a mí, te animo a que te apuntes a mi training gratuito donde te contaré todo lo que necesitas para aprender a crear tus Apps Android en Kotlin desde cero.

Quizá también te interese…

Kotlin 1.5.0 : Las 5 novedades que puedes empezar a usar hoy

Kotlin 1.5.0 : Las 5 novedades que puedes empezar a usar hoy

Kotlin 1.5.0 ya está aquí, y como siempre trae una serie de novedades que te van a interesar muchísimo. Cabe destacar que a partir de ahora, de acuerdo las nuevas versiones de Kotlin se lanzarán cada 6 meses, independientemente de las nuevas funcionalidades que...

¿Qué es Kotlin y para qué sirve?

¿Qué es Kotlin y para qué sirve?

Kotlin es un lenguaje de programación de código abierto creado por JetBrains que se ha popularizado gracias a que se puede utilizar para programar aplicaciones Android. Pero si has llegado hasta aquí pensando que Kotlin solo se puede usar en Android, lo que te voy a...

2 formas de recolectar Flows en la UI que SÍ funcionan

2 formas de recolectar Flows en la UI que SÍ funcionan

En la serie de artículos sobre Programación Reactiva con Flow hemos visto muchos conceptos, y hemos aprendido cómo aplicarlos al desarrollo Android. Pero hay algo que no hemos hecho del todo bien. Esto es la recolección de Flows desde la Activity (o el Fragment, en...

0 comentarios

Enviar un comentario

Los datos personales que proporciones a través de este formulario quedarán registrados en un fichero de Antonio Leiva Gordillo, con el fin de gestionar los comentarios que realizas en este blog. La legitimación se realiza a través del consentimiento de la parte interesada. Si no se acepta, no podrás comentar en este blog. Los datos que proporciona solo se utilizan para evitar el correo no deseado y no se usarán para nada más. Puede ejercer los derechos de acceso, rectificación, cancelación y oposición en contacto@devexperto.com.

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Acepto la política de privacidad *