Kotlin const 关键字
最后修改于 2025 年 4 月 19 日
Kotlin 的 const 关键字用于声明编译时常量。这些常量必须在编译时已知,并且不能在运行时更改。本教程通过示例深入探讨了 const 关键字。
基本定义
Kotlin 中的 const 修饰符将属性标记为编译时常量。它只能应用于基本类型或 String 的不可变属性。常量必须在顶层或对象声明中声明。
顶层常量
声明常量的最常见位置是在文件的顶层。这些常量在整个文件中都可访问,并且可以导入到其他文件中。
package com.zetcode
const val PI = 3.1415926535
const val APP_NAME = "My Kotlin App"
fun main() {
println("The value of PI is $PI")
println("Welcome to $APP_NAME")
}
在这里,我们在文件的顶层声明了两个常量。它们可以在文件的任何地方使用,而无需类的实例。这些值在编译时已知,并且不能更改。
伴生对象中的常量
常量也可以在类的伴生对象中声明。这会将相关的常量与它们相关的类分组,同时保持编译时常量的属性。
package com.zetcode
class MathUtils {
companion object {
const val E = 2.7182818284
const val GOLDEN_RATIO = 1.6180339887
}
}
fun main() {
println("Euler's number: ${MathUtils.E}")
println("Golden ratio: ${MathUtils.GOLDEN_RATIO}")
}
这些常量通过 MathUtils 类的伴生对象访问。当这些值与类密切相关时,这提供了比顶层常量更好的组织方式。这些值仍然是编译时常量。
常量 vs 常规 val
const val 和常规 val 之间的关键区别在于值的赋值时间。const val 必须在编译时已知,而 val 可以在运行时赋值。
package com.zetcode
const val COMPILE_TIME_CONST = "Hello"
val runtimeVal = "World".uppercase()
fun main() {
println("$COMPILE_TIME_CONST $runtimeVal")
}
COMPILE_TIME_CONST 在编译时已知,而 runtimeVal 在运行时计算。uppercase 调用阻止了 runtimeVal 成为编译时常量。两者都是不可变的,但在不同的时间初始化。
注解中的常量
常量通常用于注解,其中只允许编译时常量值。这确保了在编译代码时已知注解参数。
package com.zetcode
const val VERSION = "1.0.0"
@Deprecated("Use version $VERSION instead")
class OldClass
fun main() {
val obj = OldClass()
}
VERSION 常量用于 Deprecated 注解消息中。注解中只能使用编译时常量。这确保了注解值在编译期间可用。
When 表达式中的常量
常量与 when 表达式配合良好,因为这些值在编译时已知。当使用常量时,编译器可以优化 when 表达式。
package com.zetcode
const val RED = 0xFF0000
const val GREEN = 0x00FF00
const val BLUE = 0x0000FF
fun getColorName(color: Int): String {
return when (color) {
RED -> "Red"
GREEN -> "Green"
BLUE -> "Blue"
else -> "Unknown"
}
}
fun main() {
println(getColorName(RED)) // Output: Red
}
颜色常量在 when 表达式中使用。由于它们是编译时常量,编译器可以优化 when 表达式。这使得代码更有效率和可读。
数组中的常量
虽然你不能在 Kotlin 中创建 const 数组,但你可以使用常量作为数组大小或索引。这有助于使数组操作更具可读性和可维护性。
package com.zetcode
const val MAX_SIZE = 10
fun main() {
val numbers = IntArray(MAX_SIZE) { it * 2 }
for (i in 0 until MAX_SIZE) {
println(numbers[i])
}
}
MAX_SIZE 常量用于定义数组大小并控制循环。对这些值使用常量可以使代码更具可维护性。只需要在一个地方进行更改。
接口中的常量
接口可以包含常量,这些常量然后可用于所有实现类。这些常量必须在接口的伴生对象中声明。
package com.zetcode
interface Vehicle {
companion object {
const val WHEELS = 4
const val MAX_SPEED = 120
}
}
class Car : Vehicle {
fun printSpecs() {
println("Wheels: $WHEELS, Max speed: $MAX_SPEED")
}
}
fun main() {
Car().printSpecs()
}
Vehicle 接口定义了所有车辆可能共享的常量。Car 类可以直接访问这些常量。这提供了一种在相关类之间共享公共常量的方法。
常量的最佳实践
- 使用有意义的名称:按照约定,常量名称应具有描述性并使用 UPPER_SNAKE_CASE 格式。
- 分组相关常量:使用伴生对象或对象将相关常量分组在一起。
- 尽可能使用 const:对于在编译时已知的值,使用
const val以获得更好的性能。 - 限制范围:在最合适的范围级别(文件、类或接口)声明常量。
- 文档化常量:添加注释说明重要常量的目的和用法。
来源
本教程深入介绍了 Kotlin 的 const 关键字,展示了如何声明和使用编译时常量。我们探讨了各种场景,包括顶层声明、伴生对象和接口常量。正确使用常量可以使你的代码更具可维护性和效率。
作者
列出 所有 Kotlin 教程。