前言
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
objectdeclaration or a companion object. - Initialized with a value of type
Stringor 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 object中const 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中在的val与const都可以提供静态常量给全局使用,但是由于内联的特性使用const可以避免频繁的get函数调用,在这种情况下推荐使用const
欢迎关注Mike的简书
Android知识整理









网友评论