Kotlin: ¿por qué necesito inicializar una var con getter personalizado?

¿Por qué necesito inicializar una var con un getter personalizado, que devuelve una constante?

 var greeting: String // Property must be initialized get() = "hello" 

No necesito initialization cuando hago greeting de solo lectura ( val )

La razón detrás de esto es el campo de Retroceso . Cuando crea val con un getter personalizado que no utiliza el identificador de campo para acceder a su valor, no se genera el campo de respaldo.

 val greeting: String get() = "hello" 

Si lo hace, el campo de respaldo se genera y debe inicializarse.

 val greeting: String // Property must be initialized get() = field 

Ahora con var. Como el respaldo archivado se genera por defecto, debe inicializarse.

 var greeting: String // Property must be initialized get() = "hello" 

Para que esto funcione para var sin initialization, debe proporcionar un setter personalizado para evitar la generación de campo de respaldo. Por ejemplo:

 var storage: String = "" var greeting: String get() = "hello" set(value) { storage = value} 

Tu código no tiene un setter personalizado, por lo que es equivalente a:

 var greeting: String get() = "hello" set(v) {field = v} // Generated by default 

La implementación pnetworkingeterminada del set usa el field , por lo que debe inicializarlo.

Por la misma lógica, no tiene que iniciar el campo si está debajo de su set ni usarlo (lo que significa que ambos son personalizados):

 var greeting: String // no `field` associated! get() = "hello" set(v) = TODO() 
  • Android - Comprobar si no nulo no funciona como se esperaba
  • Kotlin - Cómo encontrar y moldear un elemento por su tipo
  • ViewModel for Fragment en su lugar accediendo a Activity ViewModel?
  • comstackr el bloque de Kotlin en el file build.gradle arroja el error "No se pudo encontrar el método compileKotlin () para los arguments "
  • ¿Cuál es la política de compatibilidad de Kotlin?
  • Spring Cache de arranque no es compatible con Kotlin?
  • Selecciones no deseadas en RecyclerView
  • ¿Cómo eliminar inputs duplicadas de FragmentManager?
  • Ejecuta a lo mismo que a? .run en kotlin
  • Kotlin start Application crash
  • ¿Es posible crear un tipo de function recursiva en Kotlin?