kotlin - 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 字段或在顶层。

关于kotlin - Kotlin 中的静态数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37482378/

相关文章:

asynchronous - 如何在 Kotlin 中同步检查和设置变量?

java - 为什么 AsyncHttpClient 在抛出异常后不关闭线程?

properties - 为什么在 init block 中初始化变量接口(interface)属性的代码不能编译?

java - Mockito单元测试: on all method invocations of a class,返回 "true"

android - Kotlin 协程等待 2 个或更多不同的并发请求

java - 将 Java 转换为包含代码的 Kotlin BiFunction

Kotlin 让我崩溃!当我阅读代码时,它是一个函数还是一个类?

swift - Kotlin-Swift 互操作问题 : ArrayList has wrong count value when passed as NSMutableArray from Swift Code for Release builds

java - 设置 TextView 颜色的最有效方法

android - Kotlin 委托(delegate)属性导致 Android Studio 中出现预览渲染错误