静态数据在Kotlin
请告诉我,在这个例子中是否有任何区别(以Java的方式):
-
object DefaultValues { val FILES_TO_DOWNLOAD = 100 }
和
class DefaultValues { companion object { val FILES_TO_DOWNLOAD = 100 } }
-
没有类或对象包装器:
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编译的字节码显示
-
object
或companion 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()
。 -
非
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
或@JvmField
在object
或顶层定义public static final
字段。