kotlin - reales - libro de android studio en español pdf
Datos estáticos en Kotlin (1)
Puede utilizar el visor de códigos de bytes de Kotlin para averiguar en qué se compilan estas opciones.
Con Kotlin 1.0.2 el bytecode compilado muestra que
val
propiedadval
enobject
oobject
companion object
se compila en un campoprivate static final
dentro de la clase:// access flags 0x1A private final static I FILES_TO_DOWNLOAD = 100
y un captador, que se llama al referirse a la propiedad:
// access flags 0x1019 public final static synthetic access$getFILES_TO_DOWNLOAD$cp()I
Desde Java, se puede llamar al
DefaultValues.INSTANCE.getFILES_TO_DOWNLOAD()
comoDefaultValues.INSTANCE.getFILES_TO_DOWNLOAD()
oDefaultValues.Companion.getFILES_TO_DOWNLOAD()
respectivamente.La propiedad de nivel superior no
const
se compila de la misma forma en (1) con la única diferencia de que el campo y el captador se colocan ahora dentro de la claseFilenameKt
.Pero el nivel superior de
const val
se compila en un campopublic static final
:// access flags 0x19 public final static I DEFAULT_FILES_TO_DOWNLOAD = 100
El mismo campo final estático público se producirá cuando se declare una
const val
dentro de un objeto. Además, puede lograr el mismo bytecode resultante si agrega la anotación@JvmField
a las propiedades declaradas en (1) .
En conclusión, puede definir public static final
campo public static final
utilizando const
o @JvmField
en un object
o en el nivel superior.
Por favor, dígame, ¿hay alguna diferencia (en términos de Java) en estos ejemplos:
object DefaultValues { val FILES_TO_DOWNLOAD = 100 }
y
class DefaultValues { companion object { val FILES_TO_DOWNLOAD = 100 } }
Sin envoltura de clase o objeto:
const val DEFAULT_FILES_TO_DOWNLOAD = 100
y
val DEFAULT_FILES_TO_DOWNLOAD = 100
¿Cuál es la verdadera manera de definir ?:
public static final int FILES_TO_DOWNLOAD = 100