【Kotlin】const 修饰的编译期常量
const 修饰的是编译期常量(compile-time constants),即编译器在编译时就能确定其值的常量。这类常量需要满足:
- 类型必须是基本类型(Int、Double 等)或 String
- 必须在编译时就能确定值(不能是运行时计算的结果)
以下是对 const
修饰的编译期常量三种存在场景的总结:
1. 顶层(文件级)常量
场景:直接定义在 Kotlin 文件的类外部,属于包级作用域,全局可见。
Kotlin 写法(文件名:AppConstants.kt
):
package com.example// 顶层 const 常量const val API_BASE_URL = \"https://api.example.com\"const val MAX_RETRY_COUNT = 3
等效 Java 代码:
package com.example;public final class AppConstantsKt { // 类名由文件名 + \"Kt\" 构成 public static final String API_BASE_URL = \"https://api.example.com\"; public static final int MAX_RETRY_COUNT = 3;}
特点:
- 编译后生成独立的 Java 类(文件名 + “Kt”)。
- 常量被声明为
public static final
,可直接通过类名访问(如AppConstantsKt.API_BASE_URL
)。
2. 伴生对象(companion object)内部常量
场景:定义在类的伴生对象中,属于类的静态成员,与类强关联。
Kotlin 写法:
package com.exampleclass NetworkConfig { // 伴生对象中的 const 常量 companion object { const val TIMEOUT_MS = 5000 const val ENABLE_SSL = true }}
等效 Java 代码:
package com.example;public final class NetworkConfig { public static final int TIMEOUT_MS = 5000; public static final boolean ENABLE_SSL = true; // 伴生对象相关代码(无需手动使用) public static final NetworkConfig.Companion Companion = new NetworkConfig.Companion(); public static final class Companion {}}
特点:
- 常量直接成为外部类的
public static final
成员。 - 可通过类名直接访问(如
NetworkConfig.TIMEOUT_MS
)。
3. 单例类(object 声明)内部常量
场景:定义在 object
声明的单例类中,属于单例的静态成员(单例本身全局唯一)。
Kotlin 写法:
package com.example// 单例类object AppConfig { // 单例类中的 const 常量 const val APP_VERSION = \"1.0.0\" const val IS_DEBUG = false}
等效 Java 代码:
package com.example;public final class AppConfig { public static final AppConfig INSTANCE = new AppConfig(); // 单例实例 public static final String APP_VERSION = \"1.0.0\"; public static final boolean IS_DEBUG = false; private AppConfig() {} // 私有构造函数,确保单例}
特点:
- 常量被编译为
public static final
成员,与单例实例无关。 - 可通过单例类名直接访问(如
AppConfig.APP_VERSION
)。
总结
三种场景的核心共性是:const
常量最终都会被编译为 Java 中的 public static final
静态成员,因此才能在编译期确定值并被直接访问。区别仅在于定义位置带来的作用域差异(包级、类级、单例级)。