Como hemos visto en artículos anteriores, las propiedades necesitan un valor por defecto, no se pueden declarar sin asignarles un valor.

Esto es un problema, porque imagina que quieres almacenar una vista en una property. Como este código es ejecuta durante la creación del objeto, no puedes acceder al contexto en ese momento.

¿Qué puedes hacer?

Este artículo forma parte de una serie de 30 con motivo del lanzamiento del curso presencial de Kotlin para Desarrolladores Android que impartiré en breve.

kotin-desarrolladores-android

Delegación de propiedades: delega el valor de una property en otro objeto

La delegación de propiedades utilizará otro objeto que es capaz de devolver un resultado cuando se llame al get y al set (en caso de que se utilice var).

En un mundo en el que no tenemos control sobre la creación de muchos objetos, como es el framework de Android, esta delegación nos va a salvar la vida en muchos casos.

Te voy a mostrar tres ejemplos que a mí me resultan muy útiles en Android

Setear el valor de una vista en una property

Para esto tenemos dos opciones utilizando delegación, y evitando usar null, (algo muy poco recomendado).

La primera me gusta menos, porque obliga a utilizar var para una propiedad que podría ser inmutable, y además es menos seguro.

Con la palabra reservada lateinit le decimos a esa property que no va a estar vacía, pero que todavía no tenemos su valor final:

En el onCreate podemos entonces asignarle el valor definitivo:

Esto en realidad no es un delegado, aunque hace la misma operación que el delegado notNull, que quedó relegado en favor de este primero.

La segunda opción es mucho más elegante. Consiste en usar el delegado lazy, que no ejecutará el código que se le indique hasta que no se llame por primera vez a la property:

El findView no se ejecutará hasta que no se llame al get del textView por primera vez. Es más seguro porque no se puede modificar el valor por error, y no nos obliga a acordarnos de setearlo tras el setContentView.

En el momento en que hagamos:

Se ejecutará el código de forma lazy.

Como ves, la forma de delegar es utilizando la palabra reservada by.

Vamos a ver otro ejemplo

Notificar cambios en un adapter

En un adapter podemos tener una property items que cada vez que se setee lance automáticamente una actualización del adapter:

Simplemente establece un valor inicial, y posteriormente llama a la función que se define tras cada modificación.

En este caso solo estoy llamando a notifyDataSetChanged, pero como ves, la función recibe los valores antiguos y nuevos, así que técnicamente podrías comprobar cuáles son los cambios y actualizar sólo la diferencia.

Declarar el grafo de Dagger de forma lazy

Es otra de la situaciones en las que he encontrado esta funcionalidad muy útil.

Volviendo a lazy, lo puedes utilizar para declarar el component de la aplicación durante la declaración de la property:

De esta forma no necesitas utilizar lateinit, y la propiedad se vuelve inmutable.

Puedes hacer lo mismo si estás utilizando subcomponents en las actividades:

Conclusión

La declaración de propiedades te ayudará a hacer las propiedades mucho más potentes y simplificar y reutilizar código.

Aquí sólo hemos visto propiedades estándar de la librería de Kotlin, pero puedes crear las tuyas propias.

Por ejemplo en el libro tengo una implementada que almacena y recupera datos de las SharedPreference.

Si quieres aprender mucho más sobre todo esto y coger la soltura suficiente para crear tus propias Apps Android, te recomiendo que le eches un vistazo al curso presencial que estoy preparando, y del que ya puedes reservar tu plaza.