"Lateinit" o "by perezoso" cuando se define global android.widget var / val

Al definir una variable global de android.widget , por ejemplo, TextView , ¿es preferible usar lateinit o by lazy ? Inicialmente pensé que sería preferible usar by lazy porque es inmutable, pero no estoy del todo seguro.

by lazy ejemplo:

 class MainActivity: AppCompatActivity() { val helloWorldTextView by lazy { findViewById(R.id.helloWorldTextView) as TextView } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) updateTextView(helloWorldTextView) } fun updateTextView(tv: TextView?) { tv?.setText("Hello?") } } 

ejemplo lateinit :

 class MainActivity: AppCompatActivity() { lateinit var helloWorldTextView: TextView override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) helloWorldTextView = findViewById(R.id.helloWorldTextView) as TextView updateTextView(helloWorldTextView) } fun updateTextView(tv: TextView?) { tv?.setText("Hello?") } } 

¿Hay algún beneficio de usar uno sobre el otro al definir un var / val global de android.widget ? ¿Hay algún inconveniente con el uso by lazy para definir un android.widget val? ¿La decisión se basa solo en si desea un valor mutable o inmutable?

Hay una trampa con by lazy . La propiedad del widget sería de solo lectura y, por lo tanto, técnicamente definitiva (en términos de Java). Pero no hay garantía documentada de que onCreate() se onCreate() solo una vez para una instancia. También findViewById() podría devolver null .

Por lo lateinit es preferible utilizar lateinit y obtendrá una exception para informarle si val se utilizó antes de onCreate() .

Una tercera posibilidad serían las properties sintéticas de Android . Entonces no necesita preocuparse por las variables en absoluto.

 import kotlinx.android.synthetic.main.activity_main.* helloWorldTextView.text = "Hello?" 
  • La aplicación onCreate no se llama para las comstackciones de producción
  • Invocando Acción por reference en Kotlin
  • kotlin para anular los types de protobuf a String
  • No se puede crear un nuevo usuario
  • kotlin y ArgumentCaptor - IllegalStateException
  • ¿Cuál es el `it` en el cuerpo de Kotlin lambda?
  • Extendiendo la class genérica en Kotlin
  • Establecer el valor de un campo sin llamar al método set - Kotlin
  • Por qué este código no fue devuelto en la label en Kotlin
  • Android Firestre spinner no está cargando mi documento
  • Error nulo al usar Glide con kotlin