Datos estáticos en Kotlin

Por favor, dime, ¿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 contenedor de class o object:

     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 

Puede usar el visor de códigos de bytes Kotlin para averiguar en qué se comstackn estas opciones.

Con Kotlin 1.0.2, el bytecode comstackdo muestra que

  1. val propiedad val en object u object companion object se comstack en un campo private static final dentro de la class:

      // access flags 0x1A private final static I FILES_TO_DOWNLOAD = 100 

    y un getter, que se llama al referirse a la propiedad:

      // access flags 0x1019 public final static synthetic access$getFILES_TO_DOWNLOAD$cp()I 

    Desde Java, el getter se puede llamar como DefaultValues.INSTANCE.getFILES_TO_DOWNLOAD() o DefaultValues.Companion.getFILES_TO_DOWNLOAD() respectivamente.

  2. La propiedad de nivel superior no const se comstack a la misma para (1) con la única diferencia de que el campo y getter se colocan ahora dentro de la class FilenameKt .

    Pero la const val nivel superior se comstack 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 object. Además, puede get el mismo bytecode resultante si agrega la anotación @JvmField a las properties declaradas en (1) .


Para finalizar, puede definir public static final campo public static final usando const o @JvmField en un object o en el nivel superior.

  • Cómo hacer PATCH correctamente en lenguajes fuertemente tipados basados ​​en Spring - example
  • RxAndroid - Manejar errores con el operador Zip
  • Obtener FragmentManager dentro de AndroidViewModel
  • ¿Es posible restringir el tipo de una Lista a una implementación de una interfaz en Kotlin?
  • Android, Gradle, Realm, Kotlin: Error: error: no se pudo encontrar el file AndroidManifest.xml
  • package de alternativa protegida en kotlin
  • Gradle sinc falló con la extensión de kotlin. para cadena de input: "" en el module de file build.gradle (aplicación)
  • El código de Vertx Sync se ejecuta varias veces
  • ¿Por qué no está vacío en las collections de Kotlin una propiedad?
  • MPAndroidChart datos en vivo no visibles sin límites iniciales
  • Revertir códigos de Kotlin a Java en Android Studio Canary 5