const的使用
- const 必须修饰val
- const 只允许在top-level级别和object中声明,使用方式如下:
const val THOUSAND = 1000
object myObject {
const val constNameObject: String = "constNameObject"
}
class MyClass {
companion object Factory {
const val constNameCompanionObject: String = "constNameCompanionObject"
}
}
const val和val区别:
说到这,我们还是没有搞清楚const和val的区别,ok让我们看代码分析。
object myObject {
const val constObject: String = "constObject"
val normalObject: String = "normalObject"
}
打开Android studio 点击 Tools->Kotlin->Show Kotlin ByteCode
// class version 50.0 (50)
// access flags 0x31
public final class com/example/kotlin/myObject {
// access flags 0x19
public final static Ljava/lang/String; constObject = "constObject"
@Lorg/jetbrains/annotations/NotNull;() // invisible
// access flags 0x1A
private final static Ljava/lang/String; normalObject = "normalObject"
@Lorg/jetbrains/annotations/NotNull;() // invisible
// access flags 0x11
public final getNormalObject()Ljava/lang/String;
@Lorg/jetbrains/annotations/NotNull;() // invisible
L0
LINENUMBER 144 L0
GETSTATIC com/example/kotlin/myObject.normalObject : Ljava/lang/String;
ARETURN
L1
LOCALVARIABLE this Lcom/example/kotlin/myObject; L0 L1 0
MAXSTACK = 1
MAXLOCALS = 1
......
}
从字节码我们可以看到const val 和val修饰对象的主要区别是:
- const val 可见性为public final static,可以直接访问。
- val 可见性为private final static,并且val 会生成方法getNormalObject(),通过方法调用访问。
总结:
当定义常量时,出于效率考虑,我们应该使用const val方式,避免频繁函数调用。