Cómo crear un delegado de propiedad personalizado en Kotlin
Antonio Leiva

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.

Quizá también te interese…

Cómo crear un backend en Kotlin usando Ktor

Cómo crear un backend en Kotlin usando Ktor

Ktor es un framework de servidor web ligero y rápido para Kotlin, desarrollado por JetBrains. Es ideal para crear aplicaciones web y servicios RESTful, y es muy fácil de usar y configurar. En este artículo, vamos a ver cómo crear un backend para una aplicación de...

Cómo simular una base de datos reactiva en Room con Fakes

Cómo simular una base de datos reactiva en Room con Fakes

En el desarrollo de aplicaciones móviles es muy común utilizar bases de datos para almacenar y gestionar la información que se utiliza en la aplicación. En el caso de Android, una de las opciones más populares es Room, una librería de persistencia de datos que...

Flows de Kotlin para implementar búsquedas en tiempo real

Flows de Kotlin para implementar búsquedas en tiempo real

En Android, los Flows de Kotlin son una manera de representar secuencias de datos asincrónicas que emiten valores de forma continua. Estos Flows pueden ser útiles en situaciones en las que deseamos escuchar eventos y procesar los resultados de forma asíncrona, como en...

0 comentarios

Enviar un comentario

Los datos personales que proporciones a través de este formulario quedarán registrados en un fichero de DevExpert, S.L.U., 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 *