Kotlin中的const关键字

前言

Kotlin是一种在Java虚拟机上运行的静态类型编程语言,被称之为Android世界的Swift,在GoogleI/O2017中,Google宣布Kotlin成为Android官方开发语言

const的特点

经过一段时间的Kotlin使用,一般来讲我们会将可变量声明为var,不可变量声明为val,并且在符合业务的情况下我们推荐使用不可变量去进行声明,可以确保代码的安全性,我们已经可以通过var val去声明可变以及不可变量,那么const是做什么用的?

If the value of a read-only property is known at the compile time, mark it as a compile time constant using the const modifier.

  • Top-level, or member of an object declaration or a companion object.
  • Initialized with a value of type String or a primitive type
  • No custom getter

按照文档上的描述,const用于修饰在 编译时已知的只读属性

  • 用于顶层的声明,object class 或者 companion object
  • 用于字符串或者基本数据类型
  • 没有提供get方法

编译时已知的只读属性,说明它的赋值不能是一个函数,只能是一个恒定值

val dta = test() //正确
const val DATA = test() //报错
const val VALUE = ""//正确
fun test() = ""

只能用于顶层的声明,object class 或者 companion object

const val TOP_LEVEL_CON = ""
val TOP_LEVEL = ""
object OBJ {
    const val OBJ_CON = ""
    val OBJ_VAL = ""
}
class COM_OBJ {
    val NOR_OBJ =""
    companion object {
        const val COM_CON = ""
        val COM_VAL = ""
    }
}

编译成Java代码

public static final String TOP_LEVEL_CON = "";
public static final String TOP_LEVEL = "";
public final class OBJ {
   public static final String OBJ_CON = "";
   public static final String OBJ_VAL = "";
}
public final class COM_OBJ {
   @NotNull
   private final String NOR_OBJ = "";
   @NotNull
   public static final String COM_CON = "";
   @NotNull
   public static final String COM_VAL = "";
}

会发现在顶级声明,data class以及companion objectconst val都是被编译成了static final,再看下不同方式声明的调用情况,普通类中的val被编译成了final,看下不同情况下的调用情况

fun test(){
    println(TOP_LEVEL_CON)
    println(TOP_LEVEL)
    println(OBJ_CON)
    println(OBJ_VAL)
    println(COM_OBJ().NOR_OBJ)
    println(COM_OBJ.COM_CON)
    println(COM_OBJ.CON_VAL)
}

编译后

public static final void test() {
    String var0 = "";
    System.out.println(var0);
    var0 = TOP_LEVEL;
    System.out.println(var0);
    var0 = "";
    System.out.println(var0);
    var0 = OBJ.INSTANCE.getOBJ_VAL();
    System.out.println(var0);
    var0 = (new COM_OBJ()).getNOR_OBJ();
    System.out.println(var0);
    var0 = "";
    System.out.println(var0);
    var0 = COM_OBJ.Companion.getCON_VAL();
    System.out.println(var0);
}

可以发现一些区别,在调用val时会调用其get方法,但是const会直接使用赋值,也就是说
const在使用的时候会有内联的效果,将值内联到调用处,没有提供对应的get函数

Const的使用

基于上述的尝试,总结下

  • 只能用于顶层的声明,object class 或者 companion object中
  • 用于字符串或者基本数据类型
  • const在使用的时候会有内联的效果,将值内联到调用处,没有提供对应的get函数

我们在JAVA项目中经常会定义抽离一些公共的 静态常量赋值String或者基本数据类型 ,提供给 全局的多个地方频繁的调用 ,虽然Kotlin中顶级声明,object class 或者 companion object中在的valconst都可以提供静态常量给全局使用,但是由于内联的特性使用const可以避免频繁的get函数调用,在这种情况下推荐使用const

欢迎关注Mike的

Android知识整理

你可能感兴趣的:(Kotlin中的const关键字)