请告诉我,这个例子中是否存在任何差异(就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
答案 0 :(得分:25)
您可以使用Kotlin bytecode viewer找出这些选项的编译内容。
使用Kotlin 1.0.2编译的字节码显示
val
中的object
或companion 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()
。
非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)中声明的属性,则可以获得相同的结果字节码。
总之,您可以使用public static final
或const
或@JvmField
来定义object
字段。