一、前言
一般kotlin用到的是var和val
- var:变量(读写)
- val:常量(只读)
但同时提供了一个const,val其实具有了大部分const拥有的功能,但是仔细对比了半天发现没什么卵用,但是又仔细一看,还有有点卵用的
二、介绍
查看kotlin in action,pdf文档里面介绍。大致意思是在kotlin中的顶级属性,会以getter(val 和 var)/setter(var才有)的形式暴露给Java,如果你想让其以public static final的字段呈现给调用者,可以val前面加上const修饰符。
注:kotlin中const只能用在顶级属性,以及object对象的属性中(伴随对象也是obejct)。
三、区别
1.经过const修饰的属性只能用拼接const修饰的属性去拼接
//const报错1
val testName = "ZhangSan"
//const报错2
var testName = "ZhangSan"
//正确
const val testName = "ZhangSan"
const val constNameNormal: String = "constNameNormal$testName"
val nameNormal: String = "nameNormal$testName"
2.在java中引用不同
//带1的属性是没有用const修饰的,没带1的属性是用了const修饰的
const val age: Int = 28
val age1: Int = 28
object test1 {
const val name: String = "liuliqianxiao"
val name1: String = "liuliqianxiao"
}
class Person {
companion object {
const val sex: Int = 1
val sex1: Int = 1
}
}
在kotlin中的调用如下
class Text{
fun main(args: Array<String>) {
println(age)
println(test1.name)
println(Person.sex)
println(age1)
println(test1.name1)
println(Person.sex1)
}
}
在java中的调用如下
public class Test {
public static void main(String[] args) {
//在没有加const修饰时应该如此调用
//top-level属性,
System.out.println(ConstTest.getAge1());
//单列对象的属性
System.out.println(test1.INSTANCE.getName1());
//类的伴随对象的属性
System.out.println(Person.Companion.getSex1());
//加了const修饰之后的调用
System.out.println(ConstTest.age);
System.out.println(test1.name);
System.out.println(Person.sex);
}
}
从字节码我们可以看到const val 和val修饰对象的主要区别是:
没有使用const ,在kotlin中,都是直接引用的。在java中,必须写全路径,通过getter方法获取。
const val 可见性为public final static,可以直接访问。
val 可见性为private final static,并且val 会生成方法getNormalObject(),通过方法调用访问。
四、总结
当定义常量时,出于效率考虑,我们应该使用const val方式,避免频繁函数调用。