正常的val
是正常的,并且已初始化。
class MyClass {
companion object {
private val TAG = MyClass::class.java.simpleName
}
}
但const val
会导致编译错误。
class MyClass {
companion object {
private const val TAG = MyClass::class.java.simpleName
}
}
错误日志
MyClass.kt:27:33: error: const 'val' initializer should be a constant value
private const val TAG = MyClass::class.java.simpleName
simpleName
不能定义为const val
似乎不直观。
在Kotlin
中,const
关键字只应在值为编译时常量时使用。这里MyClass::class.java.simpleName
不是编译时常量。所以我们需要使用val
而不是const
.val
与 Java 中的final
关键字相同。
有关这方面的更多信息,请查看此处
反射是一种语言在运行时检查和动态调用类、方法、属性等的能力。
反射不能在编译时使用,它们仅在运行时可用,因此您不能使用::class
或::class.java
中的任何一个,它们在编译时不可用。
const
修饰符将 val 标记为编译时常量。因此不能在编译时调用任何运行时函数。
const
关键字用于定义编译时常量,但val
可以具有运行时常量。 simplename 在编译时不可用,因此出现错误。