kotlin - 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
    

真正的定义方式是什么?:

public static final int FILES_TO_DOWNLOAD = 100

最佳答案

您可以使用 Kotlin bytecode viewer找出这些选项被编译成什么。

对于 Kotlin 1.0.2,编译后的字节码表明

  1. val 属性在 objectcompanion 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()

  2. 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/

相关文章:

android - Kotlin - 如何在 ViewPager 中添加 OnPageChangeL

kotlin - 在 Kotlin 中带有参数的单例

kotlin - Kotlin中调用父类(super class)构造函数,Super不是表达式

kotlin - 在 Kotlin 中处理可为空或空列表的惯用方式

java - 使用 JPA Criteria API 进行分页的总行数

android - 监听器绑定(bind);找不到二传手

kotlin - 如何在 Kotlin 中替换字符串中的重复空格?

annotations - Kotlin 注释 IntDef

android - 更新到 AS 3.0 Canary 6 后 transformClassesWi

exception - Kotlin - 抛出自定义异常