深入kotlin:const 对话 val,有必要用const申明变量吗?

3,810 阅读2分钟

第一次尝试这种写作风格,如果你觉得这种风格可行,点个赞吧,这对我很重要。

val

val用来申明:只读变量【read-only】。

也就相当于,java中final修饰的变量。这比较容易理解。

const

const用来申明:编译期的常量【Compile-Time Constants】

const修饰的常量需要同时满足以下三个条件:

  1. 只能是:字符串和基础类型。【String or a primitive type】

  2. 只能修饰:全局常量【top level】、object的成员、companion 对象的成员

  3. const不能单独修饰某个变量,必须和val同时修饰一个变量。

    也就是说const val 必须同时出现。

const val 修饰的的变量,一定是编译时的常量,在编译期就知道他的值了。不需要依赖运行时创建的任何变量。

而val申明的变量,是只读变量。只能赋值一次,可以是运行期间赋值。

编译时常量,属于只读变量的一种特殊情况。

const的好处

在java代码中引用kotlin的变量时,不能直接使用val的变量,但可以直接使用const val的变量.

如下kotlin代码:

奥,这就有意思了。

无const修饰的编译期常量,不仅在java代码中不能直接访问,并且还会生成相应的getXXX()方法。

这就很有意思了,如上常量:VAL_STRING,会自动生成方法:NormalClass.Companion.getVAL_STRING()。

所以能用const val的变量就不要只用val,因为这样不优雅,编译性能也比const val更低。const val不会生成相应的getXXX()方法。

我们来看看这是怎么回事?

我们看看NormalClass会被编译成什么样?转成相应的java代码看看。

  • kotlin代码

    class NormalClass{
      companion object{
        const val CONST_VAL_STRING = "constValString"
        val VAL_STRING = "valString"
      }
    }
    
  • 转成java 代码,看看真相

其他kotlin相关精彩blog

掘金最近在做年度打榜活动,大叔第一次参加这种活动也不知道怎么拉票。觉得我还行就来投我一票吧。链接