Android/Kotlin — Lazy y lateinit: Inicializando variables tardíamente
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.