编程Android开发者 / 后端开发者

在Kotlin中,常量值(const val)的初始化是如何工作的?与普通的val有什么区别,有哪些限制,它如何用于注解,为什么并非总能在想要的地方使用const val?

用 Hintsage AI 助手通过面试

答案

在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。

对类型限制的无知导致了编译错误和时间的浪费。