studio reales proyectos programacion libro introducción incluye herramientas fundamentos fuente español código con avanzado aplicaciones kotlin

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

  1. val propiedad val en object o object companion object se compila en un campo private 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() como DefaultValues.INSTANCE.getFILES_TO_DOWNLOAD() o DefaultValues.Companion.getFILES_TO_DOWNLOAD() respectivamente.

  2. 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 clase FilenameKt .

    Pero el nivel superior de const val se compila en un campo public 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:

  1. object DefaultValues { val FILES_TO_DOWNLOAD = 100 }

    y

    class DefaultValues { companion object { val FILES_TO_DOWNLOAD = 100 } }

  2. 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