Imagen de título

Alerta Coder 3 – ¿Lateinit o nulable?

Muchas veces tenemos la duda (o a lo mejor no) de si deberíamos declarar una propiedad como lateinit o como nulable (aquí tienes Kotlin.org, por si no sabes lo que es lateinit: https://kotlinlang.org/docs/reference/properties.html#late-initialized-properties-and-variables

La solución se encuentra en preguntarnos lo siguiente: «¿debe mi aplicación seguir adelante si esto es nulo?».

  • Cuando declaramos algo como nulable estamos indicando que el valor nulo es uno de los posibles estados de esa propiedad y que nuestra aplicación es capaz de dar respuesta a esta situación.

    Por ejemplo, tenemos una aplicación que crea personas mediante un formulario. Si la aplicación nos permite pulsar el botón Finalizar antes de que el formulario esté completo porque va a mostrar un mensaje de error indicando qué campos faltan por especificar, todos esos campos son nulables, ya que si los campos son nulos, la aplicación tiene prevista una respuesta correcta.
  • Sin embargo, cuando declaramos una propiedad como lateinit estamos diciéndole al compilador que, este campo no puede ser nulo y que, para cuando la aplicación tenga la necesidad de utilizar esa propiedad, sabemos a ciencia cierta que esta va a estar inicializada.

    Por ejemplo, cuando inyectamos vistas con ButterKnife en un fragment, en el método onCreateView() obtenemos un Unbinder que usamos para desvincular las vistas en el onDestroyView(). Este unbinder podemos declararlo como lateinit, ya que sabemos a ciencia cierta que, para cuando lo llamemos en onDestroyView(), va a estar inicializado; y es inadmisible que el unbinder sea nulo. Si es nulo en ese punto, has programado mal.

Otra pista para saber si deberíamos hacer algo nulable en lugar de lateinit es cuando nos preguntamos «¿estará inicializada esta propiedad para cuando llegue a esta línea?». Si te lo estás preguntando es porque sabes que, para la aplicación, es un estado posible el llegar ahí y que esa propiedad no tenga valor, por lo tanto, es nulable.

Curiosidades

Primera

Todo lateinit tiene una propiedad que indica si está incializada o no: isInitialized, y solo se puede acceder a esta de la siguiente manera:

Pero esto SOLAMENTE debería ser utilizado para depurar, nunca en producción, ya que, si tienes que comprobar esto, es porque estás, con total seguridad, lidiando con una propiedad que debería ser nulable.

Puedes ver algo más de documentación sobre esto aquí y aquí.

Segunda

No se pueden declarar como lateinit aquellos objetos que en Java se traducen por tipos primitivos:

Ninguno de estos funciona y el compilador te avisará de ello.

Tercera

Puedes simular un lateinit para tipos primitivos utilizando el delegate notNull:

Otras Alertas Coder

0 Comentarios

Contesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

*

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.

©2020 Codictados Comunidad libre para el aprendizaje de codigo Online

o

Inicia Sesión con tu Usuario y Contraseña

o    

¿Olvidó sus datos?

o

Create Account