Kotlin val difference getter override vs assignment

Empecé a jugar con Kotlin y leí algo sobre mutable val con un getter personalizado. Como se menciona en, por ejemplo, aquí o en la Convención de encoding de Kotlin , no se debe anular el captador si el resultado puede cambiar.

class SampleArray(val size: Int) { val isEmpty get() = size == 0 // size is set at the beginning and does not change so this is ok } class SampleArray(var size: Int) { fun isEmpty() { return size == 0 } // size is set at the beginning but can also change over time so function is prefenetworking } 

Pero solo desde la perspectiva del uso como en las pautas, ¿dónde está la diferencia entre los dos siguientes

 class SampleArray(val size: Int) { val isEmpty get() = size == 0 // size can not change so this can be used instad of function val isEmpty = size == 0 // isEmpty is assigned at the beginning ad will keep this value also if size could change } 

A partir de esta respuesta pude ver que para anular getter el valor no se almacena. ¿Hay alguna otra cosa donde la anulación getter es diferente de la asignación? Tal vez con delegates o latinos?

En su segundo ejemplo, el size es un valor inmutable y, por lo tanto, ambas forms son válidas.

Sin embargo, la variante con get() = size == 0 obsoleto get() = size == 0 no tiene campo de respaldo y, por lo tanto, el size == 0 se evalúa cada vez que accede a la variable isEmpty .

Por otro lado, cuando se utiliza inicializador = size == 0 el size == 0 expresión size == 0 se evalúa durante la construcción (compruebe exactamente cuándo y cómo: un análisis en profundidad de los inicializadores de Kotlin ) y almacenado en el campo de respaldo , valor si luego se devuelve cuando accede a la variable.

La diferencia key aquí es que en val isEmpty get() = ... el cuerpo se evalúa cada vez que se accede a la propiedad, y en val isEmpty = ... la expresión en el lado derecho se evalúa durante la construcción del object, el el resultado se almacena en el campo de respaldo y este resultado exacto se devuelve cada vez que se usa la propiedad.

Por lo tanto, el primer enfoque es adecuado cuando desea que el resultado se calcule cada vez, mientras que el segundo enfoque es bueno cuando desea que el resultado se calcule solo una vez y se almacene.

  • Choque inusual solo en algún dispositivo: llamadas asincrónicas corotines kotlin
  • Usando las constantes de kotlin en la expresión del interruptor java
  • ¿Hay alguna forma de limitar la visibilidad de las funciones stdlib en Kotlin?
  • ¿Hay un equivalente en Kotlin para Swift init (se repite: count :)
  • ¿Se puede usar la sobrecarga del operador de comparación en Kotlin para implementar la funcionalidad similar a SQL?
  • Genéricos para RecyclerView.Adapter Android
  • ¿Cómo replace el doAsync de Anko, uiThread con las funciones de kotlin 1.1.0 kotlinx-coroutines-core lib?
  • android anko alert layout personalizado currentFocus
  • Cómo llenar una vista de list usando Kotlin, retroadaptación y RXjava
  • ¿Por qué el código en una expresión de object puede acceder a variables del ámbito que lo contiene en kotlin?
  • Devuelve el resultado vacío en requery QueryRecyclerAdapter