在Kotlin中,关键字const val用于声明编译时常量,即在编译阶段已知和计算的值。
const val仅适用于顶层变量,或者声明为object对象或companion object的属性。String、数值原始类型或Boolean。val是一个不可变变量,但值可以在运行时指定,这允许在初始化时进行计算或调用函数:
val timestamp = System.currentTimeMillis() // 这不是const val const val APP_NAME = "MyApp" // 这是编译时常量
在注解中只能使用const val,示例:
const val AUTHOR = "John Doe" @Target(AnnotationTarget.CLASS) annotation class Author(val name: String) @Author(AUTHOR) class Example
如果尝试在这种情况下使用val,将会出现编译错误。
为什么不能在普通类中声明
const val?
**答案:**因为const val要求变量在编译阶段可用,而实例类的变量仅在对象创建时初始化,因此它们不能是编译时常量。
class Example { // 错误!不能这样 // const val CLASS_NAME = "MyClass" }
背景
构建失败,因为开发者试图通过注解传递计算时执行的值。
开发者声明:
val version = getVersionFromConfig() @Target(AnnotationTarget.CLASS) annotation class Version(val value: String) @Version(version) class App
项目无法编译,因为只有const val可以在注解参数中使用!
背景
Android错误:试图将局部变量用作Intent中的常量键。
class Keys { companion object { val EXTRA_USER_ID = "userId" } } intent.putExtra(Keys.EXTRA_USER_ID, userId)
在某些工具或框架中,期望使用const val而不是普通的val,否则IDE或Android资源无法将这些值视作编译时常量。
背景
为const val使用不适当类型。
const val LIST = listOf(1,2,3) // 错误!只能是原始类型和String。
对类型限制的无知导致了编译错误和时间的浪费。