¿Es una 'propiedad' privada un 'campo'?

En cuanto a las properties en Kotlin, este concepto es algo nuevo para mí, así que tengo curiosidad, ¿es legítimo afirmar que una property privada es un field (variable de instancia)?

Puede considerar las properties como valores que puede get (y establecer para las variables), pero pueden tener un comportamiento personalizado y anulable y es posible que no se almacenen realmente. Entonces las properties no son campos.

En Kotlin, todas las properties miembro, private o no, pueden tener un campo de respaldo , pero no es necesario.

  • Propiedad con un campo de respaldo:

     var counter = 0 

    Aquí, 0 se coloca en el campo de respaldo, y la propiedad se comporta como un campo : al get un valor de él, se devuelve el valor almacenado en el campo, al establecer un valor solo se almacena el valor en el campo de respaldo. Pero no es un campo, por ejemplo, para Java seguirá siendo un par de getter y setter.

    Las properties privadas sin acceso personalizado se optimizan y comstackn en campos para evitar la sobrecarga de llamada de function, pero es más bien un detalle de implementación, y agregar un acceso personalizado también cambiará el bytecode en el que se comstack el acceso a la propiedad.

     var counter = 0 get() = field + 1 set(value) { if (value >= 0) field = value } 

    Aquí nuevamente la propiedad tiene un campo de respaldo, pero su comportamiento es diferente, los accesadores personalizados get() y set(...) se ejecutarán en sentencias como counter = something o val x = counter . Esto es cierto para acceder a la propiedad tanto desde dentro como desde fuera de la class, y private properties private no son diferentes aquí.

    El campo de respaldo se puede acceder directamente solo dentro del código de acceso mediante un field palabra key suave, no está expuesto al otro código. Si desea acceder al valor de respaldo desde otro lugar, debe definir otra propiedad de respaldo . Puede exponer un campo de respaldo a código Java agregando la anotación @JvmField a la propiedad (esto no lo hará accesible desde Kotlin).

  • Propiedad sin un campo de respaldo

    Cuando una propiedad no tiene inicializador y tiene al less get() , es una propiedad sin campo de respaldo:

     val time: Long get() = System.currentTimeMillis() 

    No se generará ningún campo de respaldo para él, pero puede usar otra propiedad como propiedad de respaldo como se indicó anteriormente.


Las properties sin campo de respaldo también pueden ser properties de extensión , lo cual está bastante lejos de los campos :

 val String.isCapitalized: Boolean get() = length > 0 && this[0].isUpperCase() 

Estos también pueden ser private , pero tendrán una semántica diferente.

No porque "las classs en Kotlin no pueden tener campos" ( Propiedades y campos – Lenguaje de progtwigción de Kotlin ).

Además, "si necesita exponer una propiedad Kotlin como un campo en Java, debe anotarla con la anotación @JvmField " ( Llamando a Kotlin desde Java – Lenguaje de progtwigción Kotlin ). Sin embargo, todavía no es un campo.

Como las classs de Kotlin no tienen campos, es mejor referirse siempre a las properties como properties.