静态数据在Kotlin

请告诉我,在这个例子中是否有任何区别(以Java的方式):

  1. object DefaultValues { val FILES_TO_DOWNLOAD = 100 } 

     class DefaultValues { companion object { val FILES_TO_DOWNLOAD = 100 } } 
  2. 没有类或对象包装器:

     const val DEFAULT_FILES_TO_DOWNLOAD = 100 

     val DEFAULT_FILES_TO_DOWNLOAD = 100 

什么是真正的定义?

 public static final int FILES_TO_DOWNLOAD = 100 

您可以使用Kotlin字节码查看器来查找这些选项编译到的内容。

用Kotlin 1.0.2编译的字节码显示

  1. objectcompanion object val属性被编译到类中的private static final字段中:

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

    和一个吸气剂,当涉及到财产时被调用:

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

    从Java中,getter可以分别调用DefaultValues.INSTANCE.getFILES_TO_DOWNLOAD()DefaultValues.Companion.getFILES_TO_DOWNLOAD()

  2. const顶级属性被编译为与(1)相同,只不过现在将字段和getter放置在FilenameKt类中。

    但是顶层的const val被编译成一个public static final字段:

     // access flags 0x19 public final static I DEFAULT_FILES_TO_DOWNLOAD = 100 

    在对象内部声明一个const val时,会产生相同的公共静态final字段。 另外,如果将@JvmField注释添加到(1)中声明的属性,则可以实现相同的结果字节码。


最后,你可以使用const@JvmFieldobject或顶层定义public static final字段。