Cómo crear un delegado de propiedad personalizado en Kotlin

A
Antonio Leiva
3 min lectura

En Kotlin, es posible crear un delegado de propiedad personalizado para reutilizar lógica y simplificar la sintaxis de nuestro código. Un delegado de propiedad es una clase que se encarga de almacenar y administrar el valor de una propiedad. Al utilizar un delegado, podemos definir el comportamiento de nuestras propiedades de forma más concreta y específica.

Para crear un delegado de propiedad personalizado en Kotlin, es necesario implementar la interfaz ReadWriteProperty. Esta interfaz cuenta con tres métodos que debemos implementar: getValue, setValue y getDelegate. A continuación, se muestra un ejemplo de un delegado de propiedad personalizado que permite establecer un límite máximo y mínimo a una propiedad numérica:

class LimitedIntDelegate(private val min: Int, private val max: Int) : ReadWriteProperty<Any, Int> {

    private var value: Int? = null

    override fun getValue(thisRef: Any, property: KProperty<*>): Int {
        return value ?: min
    }

    override fun setValue(thisRef: Any, property: KProperty<*>, value: Int) {
        this.value = if (value in min..max) value else if (value < min) min else max
    }

}

Luego, podemos utilizar nuestro delegado de propiedad personalizado en nuestra clase de la siguiente manera:

class MyClass {
    var limitedProperty: Int by LimitedIntDelegate(0, 100)
}

En este caso, la propiedad limitedProperty sólo podrá tener valores comprendidos entre 0 y 100. Si intentamos establecer un valor fuera de este rango, el delegado se encargará de ajustarlo al límite máximo o mínimo según corresponda.

Otra forma de crear un delegado de propiedad personalizado es mediante la sobrecarga de operadores.

En lugar de implementar la interfaz ReadWriteProperty, podemos definir dos funciones de sobrecarga de operadores: una para la lectura y otra para la escritura.

A continuación, se muestra un ejemplo de cómo podríamos crear nuestro delegado utilizando sobrecarga de operadores:

class LimitedIntDelegate(private val min: Int, private val max: Int) {

    private var value: Int? = null

    operator fun getValue(thisRef: Any, property: KProperty<*>): Int {
        return value ?: min
    }

    operator fun setValue(thisRef: Any, property: KProperty<*>, value: Int) {
        this.value = if (value in min..max) value else if (value < min) min else max

Con esto, nuestra propiedad limitedProperty se comportará de la misma forma que en el ejemplo anterior, permitiendo sólo valores comprendidos entre 0 y 100.

Es importante tener en cuenta que, al utilizar un delegado de propiedad personalizado, la propiedad en sí no almacena directamente el valor. En su lugar, el delegado se encarga de almacenar y administrar el valor de la propiedad. Esto nos permite tener un mayor control sobre el comportamiento de nuestras propiedades y reutilizar lógica en diferentes clases y propiedades.

En resumen, crear un delegado de propiedad personalizado en Kotlin nos permite definir de manera más específica el comportamiento de nuestras propiedades y reutilizar lógica de manera eficiente.

Podemos hacerlo implementando la interfaz ReadWriteProperty o utilizando sobrecarga de operadores.

Con un poco de práctica, podremos aprovechar al máximo los beneficios que nos ofrecen los delegados de propiedad en nuestro código en Kotlin.