请告诉我,这个例子有什么不同(在 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
字段或在顶层。
关于kotlin - Kotlin 中的静态数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37482378/