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 项目地址


原始标题:Best Practices for Using Constants in Kotlin