Kotlin中的静态数据

时间:2016-05-27 11:30:56

标签: 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
    
  3. 定义的真正方法是什么?:

    public static final int FILES_TO_DOWNLOAD = 100
    

1 个答案:

答案 0 :(得分:25)

您可以使用Kotlin bytecode viewer找出这些选项的编译内容。

使用Kotlin 1.0.2编译的字节码显示

  1. val中的objectcompanion object属性被编译为班级中的private static final字段:

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

    和一个getter,在引用属性时调用:

     // 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时,将生成相同的公共静态最终字段。此外,如果将@JvmField注释添加到(1)中声明的属性,则可以获得相同的结果字节码。

  3. 总之,您可以使用public static finalconst@JvmField来定义object字段。