Kotlin se enfoca en la seguridad de tipos y evitar punteros nulos, pero a menudo surge la necesidad de inicializar variables de manera tardía (late), por ejemplo, al usar inyección de dependencias o en una Actividad de Android. Para esto se ha añadido el modificador lateinit.
Las propiedades normales requieren inicialización obligatoria o deben ser anulables, lo cual es incómodo si se garantiza la inicialización tardía pero obligatoria. Usar un tipo anulable complica el código y requiere verificaciones adicionales de null.
lateinit permite crear una propiedad no inicializada temporalmente, pero prometiendo al compilador que será inicializada antes de su primer uso. Se puede inicializar no en el constructor, sino más tarde.
class UserViewModel { lateinit var repository: UserRepository fun onCreate() { repository = UserRepository() } fun getData() = repository.load() }
Características clave:
¿Se puede aplicar lateinit a propiedades val?
No. lateinit solo funciona con var, ya que val debe ser inicializado una vez inmediatamente o a través de un getter.
¿Funciona lateinit con tipos Int, Boolean, Double y otros primitivos?
No. Solo con tipos de referencia de objetos. Para primitivos, use tipos anulables.
¿Qué sucede si se accede a una propiedad lateinit antes de la inicialización?
Kotlin lanzará UninitializedPropertyAccessException:
lateinit var foo: String println(foo) // Exception
Un desarrollador declaró lateinit var item: String, no lo inicializó antes de la primera llamada al método getItem. Resultado: caída de la aplicación.
Ventajas:
Desventajas:
Actividad de Android: lateinit var presenter, inicialización en onCreate. Usar presenter en todos los métodos de ciclo de vida es seguro: no se necesita nulidad.
Ventajas:
Desventajas: