在kotlin语法中,修饰符var用来修饰可变变量,val修饰只读变量。关于val的只读属性而不是不可变属性,能够参考:val的只读属性java
可是Kotlin同时又提供了一个const修饰符。在开发过程当中,若是咱们在伴生对象中定义了一个val类型的变量,那么Android Studio会智能的提示开发者须要使用const来修饰该变量。 android
const只能修饰val,不能修饰var类型变量 bash
const 只容许在top-level级别和object(伴随对象也是obejct)中声明。函数
const val constVariable = "const_variable"
object obj{
const val constVariable = "const_variable"
}
class ConstKotlin {
companion object{
const val constVariable = "const_variable"
}
}
复制代码
const val constVariable: String = ""
val nonConstVariable: String = ""
//object
object obj {
const val constVariableObj: String = ""
val nonConstVariableObj: String = ""
}
//companion object
class ConstKotlin {
companion object {
const val constVariableCompanion: String = ""
val nonConstVariableCompanion: String = ""
}
}
fun main(args: Array<String>) {
println(constVariable)
println(nonConstVariable)
println(obj.constVariableObj)
println(obj.nonConstVariableObj)
println(ConstKotlin.constVariableCompanion)
println(ConstKotlin.nonConstVariableCompanion)
}
复制代码
(2)java引用:post
public static void main(String[] args) {
System.out.println(ConstKotlinKt.getNonConstVariable());
System.out.println(ConstKotlinKt.constVariable);
System.out.println(obj.constVariableObj);
System.out.println(obj.INSTANCE.getNonConstVariableObj());
System.out.println(ConstKotlin.constVariableCompanion);
System.out.println(ConstKotlin.Companion.getNonConstVariableCompanion());
}
复制代码
(1)在kotlin语法中,有没有const修饰都是直接引用的,感受不到引用方式上有什么区别。性能
(2)在java语法中,没用contt修饰的,经过getter方法获取属性信息,而用了const修饰符的属性,则能够直接像java中的常量同样直接经过类引用。ui
根据如下代码生成的字节码,编译出来的java代码。来看看两者的区别。this
class ConstKotlin {
companion object {
const val constVariableCompanion: String = ""
val nonConstVariableCompanion: String = ""
}
}
复制代码
关于Metadata的信息说明:Metadata说明spa
(1)const val 修饰的属性至关于java中的public final static修饰的常量,能够经过类名直接访问。debug
(2)val 修饰的属性至关于java中private final static修饰的常量,因为可见行为private,因此只能经过生成getter方法访问。
(3)出于性能考虑,使用const val方式能够避免频繁函数调用。
@Metadata(
mv = {1, 1, 15},
bv = {1, 0, 3},
k = 1,
d1 = {"\u0000\f\n\u0002\u0018\u0002\n\u0002\u0010\u0000\n\u0002\b\u0003\u0018\u0000 \u00032\u00020\u0001:\u0001\u0003B\u0005¢\u0006\u0002\u0010\u0002¨\u0006\u0004"},
d2 = {"Lcom/jandroid/module_common/ConstKotlin;", "", "()V", "Companion", "module_common_debug"}
)
public final class ConstKotlin {
@NotNull
public static final String constVariableCompanion = "";
@NotNull
private static final String nonConstVariableCompanion = "";
public static final ConstKotlin.Companion Companion = new ConstKotlin.Companion((DefaultConstructorMarker)null);
@Metadata(
mv = {1, 1, 15},
bv = {1, 0, 3},
k = 1,
d1 = {"\u0000\u0014\n\u0002\u0018\u0002\n\u0002\u0010\u0000\n\u0002\b\u0002\n\u0002\u0010\u000e\n\u0002\b\u0004\b\u0086\u0003\u0018\u00002\u00020\u0001B\u0007\b\u0002¢\u0006\u0002\u0010\u0002R\u000e\u0010\u0003\u001a\u00020\u0004X\u0086T¢\u0006\u0002\n\u0000R\u0014\u0010\u0005\u001a\u00020\u0004X\u0086D¢\u0006\b\n\u0000\u001a\u0004\b\u0006\u0010\u0007¨\u0006\b"},
d2 = {"Lcom/jandroid/module_common/ConstKotlin$Companion;", "", "()V", "constVariableCompanion", "", "nonConstVariableCompanion", "getNonConstVariableCompanion", "()Ljava/lang/String;", "module_common_debug"}
)
public static final class Companion {
@NotNull
public final String getNonConstVariableCompanion() {
return ConstKotlin.nonConstVariableCompanion;
}
private Companion() {
}
// $FF: synthetic method
public Companion(DefaultConstructorMarker $constructor_marker) {
this();
}
}
}
复制代码