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方式,避免频繁函数调用。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容