Android/Kotlin — Lazy y lateinit: Inicializando variables tardíamente

Armando Picón
DevPicon by Armando
2 min readMar 11, 2017

El antiguo concepto “inicialización perezosa o inicialización tardía”, la capacidad de diferir la inicialización de una variable a un momento posterior se maneja en Kotlin a través de dos características.

Vamos a repasar estas dos características:

Initialization by Lazy

El código a continuación corresponde a la inicialización de la variable adapter pero esta solo se realizará durante la primera vez en que se haga uso de la variable adapter. Por definición lazy es una función que durante la primera invocación ejecuta el lambda que se le haya pasado y en posteriores invocaciones retornará el valor computado inicialmente.

val adapter: EventAdapter by lazy { initializeAdapter() }

Late initialization

En el siguiente código básicamente la inicialización se da posteriormente. Habitualmente cuando una variable no es de un tipo que acepte null requiere ser inicializada en el constructor; sin embargo, no siempre aplica esto como, por ejemplo, en situaciones donde la inicialización de las variables se da a través de la inyección de dependencias o en la función setup dentro de nuestras pruebas unitarias. Para manejar este tipo de situaciones, sobretodo para evitar las verificaciones de valores nulos podemos marcar la propiedad con el modificador lateinit (recordemos que para declarar una variable que acepte valores nulos debemos agregar el signo de interrogación al nombre de la clase).

lateinit var adapter: MyAdapter
...
adapter = MyAdapter()

Es bueno recalcar que la aplicación de lazy aplica para propiedades de tipo val (inmutables) y lateinit para propiedades de tipo var (mutables) siempre que no tenga un setter o getter personalizado ni que sea un tipo primitivo.

Enlaces útiles

Les comparto algunos enlaces tanto de la documentación oficial como de Stackoverflow que pueden serles de utilidad.

¡Gracias por leer el artículo, significa mucho para mi! Si lo disfrutaste o fue de utilidad por favor recomiéndalo y compartelo con tus amigos.

Me puedes encontrar en Twitter, en Github y en Youtube.

--

--

Armando Picón
DevPicon by Armando

lifelong learner • 👨🏽‍💻 Android eng (ex: @uber ) • 🇵🇪 @ 🇨🇱 • @gdgopen • content creator @devpicon | @primosauda