whats uninitializedpropertyaccessexception property not new lateinit initialized has been android kotlin kotlin-null-safety

android - uninitializedpropertyaccessexception - Kotlin-lateinit VS Any?=nulo



lateinit property instance has not been initialized (3)

En Kotlin parece haber dos métodos para declarar una variable dentro de un objeto que puede ser nulo e instanciado después de que se crea el objeto.

var myObject : Any? = null

o

var lateinit myObject : Any

Estoy confundido acerca de por qué se necesita la palabra clave lateinit si podemos hacer la var nullable y asignarla más tarde. ¿Cuáles son las ventajas y desventajas de cada método y en qué situación se debe usar cada uno?


Aquí es cómo veo la diferencia de acuerdo con mi conocimiento actual en Kotlin.

El primero:

var myObject1 : Any? = null

Aquí myObject1 es una propiedad que es anulable. Eso significa que puedes asignarle un null .

Segundo:

lateinit var myObject2 : Any

Aquí myObject2 es una propiedad no nula. Eso significa que no puedes asignarle un null . Normalmente, si una propiedad no es nula, debe inicializarla en la declaración. Pero agregar la palabra clave lateinit permite posponer la inicialización. Si intenta acceder a la propiedad lateinit antes de inicializarla, obtendrá una excepción.

En resumen, la principal diferencia es que myObject1 es un nullable y myObject2 es un nulo. La palabra clave lateinit proporciona un mecanismo de conveniencia para permitir que una propiedad no nula se inicialice en un momento posterior en lugar de inicializarla en la declaración.

Para más información verifica this .


Si su propiedad no debe ser null , pero simplemente no se establece después de algún momento en el futuro, es más seguro declararla con una palabra clave de lateinit . Eso garantiza que, si accede a él antes de configurarlo, obtendrá una excepción que explica exactamente eso.

La forma tradicional de Java es lanzar una NullPointerException genérica sin ninguna explicación al respecto. Si usted mismo escribió el código, es posible que tenga una pista, pero si alguien más detecta el error, no estará claro por qué esa variable en particular es null .


lateinit palabra clave lateinit se usa en un campo para avoid verificaciones nulas al hacer referencia al campo dentro de su objeto. La palabra clave se usa principalmente cuando se usa la inyección de dependencia para inicializar la variable, o inicializar la variable en el método de configuración de una prueba unitaria

? se usa en un campo cuando el campo se inicializará más adelante en su programa, ya sea por un colocador o dentro de un método del objeto, esto es para obligarlo a verificar el valor nulo o usar seguridad nula ( ?. ) al hacer referencia al campo