请告诉我,这个例子有什么不同(在 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 bytecode viewer找出这些选项被编译成什么。
对于 Kotlin 1.0.2,编译后的字节码表明
val
属性在 object
或 companion object
被编译成一个 private static final
字段里面类(class):
// 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()
。
Non-const
顶级属性编译为与 (1) 相同,唯一的区别是字段和 getter 放在 FilenameKt 中
类。
但是顶层 const val
被编译成 public static final
字段:
// access flags 0x19
public final static I DEFAULT_FILES_TO_DOWNLOAD = 100
当在对象中声明 const val
时,将产生相同的 public static final 字段。此外,如果添加 @JvmField
,您可以获得相同的结果字节码。 (1)中声明的属性的注释。
最后,您可以在 object
中使用 const
或 @JvmField
定义 public static final
字段或在顶层。
https://stackoverflow.com/questions/37482378/