1. 概述
本文将介绍在 Kotlin 中使用常量的一些最佳实践。我们将讨论:
- Kotlin 中允许的常量类型
- 如何在顶层定义常量
- 如何在
companion object
中定义常量 - 如何从 Java 代码中访问 Kotlin 中定义的常量
这些内容将帮助你在实际开发中更合理地组织常量,提升代码的可读性和可维护性。
2. 允许使用的常量类型
Kotlin 中只有 基本类型(数值、字符、布尔值)和 String 类型 才能被声明为常量(使用 const val
)。
举个例子,如果我们尝试将一个自定义类的实例声明为常量:
class SimpleClass {
}
然后尝试定义常量:
const val constantAtTopLevel = SimpleClass()
编译器会报错:
Const 'val' has type 'SimpleClass'. Only primitives and String are allowed
✅ 结论: 只有原始类型和字符串才能使用 const val
声明为常量。
3. 在顶层定义常量
Kotlin 并不要求一个文件只能包含一个类,一个文件中可以包含多个类、函数和变量。顶层定义的常量可以直接被其他类访问。
例如,我们在 ConstantsBestPractices.kt
文件中定义一个常量:
const val CONSTANT_AT_TOP_LEVEL = "constant value defined at the top-level"
然后在测试类中直接引用它:
class ConstantAtTopLevelTest {
@Test
fun whenAccessingConstantAtTopLevel_thenItWorks() {
Assertions.assertThat(CONSTANT_AT_TOP_LEVEL).isEqualTo("constant value defined at the top-level")
}
}
⚠️ 注意:顶层常量即使被声明为 private
,也只能在当前文件中访问,无法限制到某个具体的类。
✅ 适用场景: 当常量与某个类无直接关系,但需要在多个类之间共享时,使用顶层常量是一个不错的选择。
4. 顶层常量的局限性
虽然顶层常量使用起来非常方便,但也有一些需要注意的地方:
- 无法控制访问权限到类级别:即使声明为
private
,也只能限制在文件内访问。 - 编译器会生成额外的类:例如,
ConstantsBestPractices.kt
文件中定义的常量会被编译成一个名为ConstantsBestPracticesKt
的类。
❌ 缺点: 这种方式会让常量与类无明确关联,不利于代码的组织和理解。
5. 在 companion object 中定义常量
如果希望常量与某个类紧密相关,可以将其定义在该类的 companion object
中。
示例:
class ConstantsBestPractices {
companion object {
const val CONSTANT_IN_COMPANION_OBJECT = "constant in companion object"
}
}
然后在测试类中使用:
class ConstantInCompanionObjectTest {
@Test
fun whenAccessingConstantInCompanionObject_thenItWorks() {
Assertions.assertThat(ConstantsBestPractices.CONSTANT_IN_COMPANION_OBJECT)
.isEqualTo("constant in companion object")
}
}
⚠️ 注意:使用时需要导入常量,例如:
import com.baeldung.constants.ConstantsBestPractices.Companion.CONSTANT_IN_COMPANION_OBJECT
✅ 优点: 常量与类强关联,逻辑清晰,结构合理。
6. 从 Java 中访问 Kotlin 的常量
如果你的项目是 Kotlin 和 Java 混合开发,那么你可能会遇到从 Java 调用 Kotlin 常量的场景。
我们定义两个常量:
const val CONSTANT_AT_TOP_LEVEL = "constant at top level"
class ConstantsBestPractices {
companion object {
const val CONSTANT_IN_COMPANION_OBJECT = "constant in companion object"
}
}
在 Java 中访问它们:
public class AccessKotlinConstant {
private String staticObjectFromTopLevel = ConstantsBestPracticesKt.CONSTANT_AT_TOP_LEVEL;
private String staticObjectFromCompanion = ConstantsBestPractices.CONSTANT_IN_COMPANION_OBJECT;
}
✅ 总结:
- 顶层常量通过
文件名Kt.常量名
的方式访问 companion object
中的常量则通过类名.常量名
的方式访问
7. 总结
本文介绍了 Kotlin 中常量的定义方式及使用场景:
- ✅ 只有原始类型和字符串可以声明为
const val
- ✅ 顶层常量适合跨类共享且无具体类关联的常量
- ❌ 顶层常量访问控制不够灵活
- ✅
companion object
中的常量适合与类强关联的场景 - ✅ Kotlin 常量可以从 Java 中访问,但访问方式略有不同
合理使用常量定义方式,有助于提升代码的可维护性和结构清晰度。
如需查看完整示例代码,欢迎访问 GitHub 项目地址。