前言
Kotlin
是一种在Java
虚拟机上运行的静态类型编程语言,被称之为Android
世界的Swift
,在Google
I/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 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知识整理
网友评论