Kotlin之const val和val

const的使用

  • const 必须修饰val
  • const 只允许在top-level级别和object中声明,使用方式如下:
const val THOUSAND = 1000

object myObject {
    const val constNameObject: String = "constNameObject"
}


class MyClass {

    companion object Factory {
        const val constNameCompanionObject: String = "constNameCompanionObject"
    }
}

const val和val区别:

说到这,我们还是没有搞清楚const和val的区别,ok让我们看代码分析。

object myObject {
    const val constObject: String = "constObject"
    val normalObject: String = "normalObject"
}

打开Android studio 点击 Tools->Kotlin->Show Kotlin ByteCode

// class version 50.0 (50)
// access flags 0x31
public final class com/example/kotlin/myObject {


  // access flags 0x19
  public final static Ljava/lang/String; constObject = "constObject"
  @Lorg/jetbrains/annotations/NotNull;() // invisible

  // access flags 0x1A
  private final static Ljava/lang/String; normalObject = "normalObject"
  @Lorg/jetbrains/annotations/NotNull;() // invisible

  // access flags 0x11
  public final getNormalObject()Ljava/lang/String;
  @Lorg/jetbrains/annotations/NotNull;() // invisible
   L0
    LINENUMBER 144 L0
    GETSTATIC com/example/kotlin/myObject.normalObject : Ljava/lang/String;
    ARETURN
   L1
    LOCALVARIABLE this Lcom/example/kotlin/myObject; L0 L1 0
    MAXSTACK = 1
    MAXLOCALS = 1

  ......
}

从字节码我们可以看到const val 和val修饰对象的主要区别是:

  • const val 可见性为public final static,可以直接访问。
  • val 可见性为private final static,并且val 会生成方法getNormalObject(),通过方法调用访问。

总结:

当定义常量时,出于效率考虑,我们应该使用const val方式,避免频繁函数调用。

    原文作者:Android
    原文地址: https://www.jianshu.com/p/01aac645d003
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞