Kotlin之const val和val

作者: wenson123 | 来源:发表于2018-05-07 16:19 被阅读21次

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

    相关文章

      网友评论

        本文标题:Kotlin之const val和val

        本文链接:https://www.haomeiwen.com/subject/jskvrftx.html