【Kotlin】const 修饰的编译期常量

const 修饰的是编译期常量(compile-time constants),即编译器在编译时就能确定其值的常量。这类常量需要满足:

  • 类型必须是基本类型(Int、Double 等)或 String
  • 必须在编译时就能确定值(不能是运行时计算的结果)

以下是对 const 修饰的编译期常量三种存在场景的总结:

1. 顶层(文件级)常量

场景:直接定义在 Kotlin 文件的类外部,属于包级作用域,全局可见。

Kotlin 写法 (文件名:AppConstants.kt):

kotlin 复制代码
package com.example

// 顶层 const 常量
const val API_BASE_URL = "https://api.example.com"
const val MAX_RETRY_COUNT = 3

等效 Java 代码

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 写法

kotlin 复制代码
package com.example

class NetworkConfig {
    // 伴生对象中的 const 常量
    companion object {
        const val TIMEOUT_MS = 5000
        const val ENABLE_SSL = true
    }
}

等效 Java 代码

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 写法

kotlin 复制代码
package com.example

// 单例类
object AppConfig {
    // 单例类中的 const 常量
    const val APP_VERSION = "1.0.0"
    const val IS_DEBUG = false
}

等效 Java 代码

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 静态成员,因此才能在编译期确定值并被直接访问。区别仅在于定义位置带来的作用域差异(包级、类级、单例级)。

相关推荐
皮皮宋吖1 分钟前
皮皮宋渗透日记 11|文件包含漏洞全解析:LFI/RFI/ 伪协议 / 绕过 / 防御
android·安全
小杍随笔2 分钟前
【Rust 语言编程知识与应用:闭包详解】
开发语言·后端·rust
阿拉斯攀登6 分钟前
【无人售货柜・RK+YOLO】篇 6:安卓端落地!RK3576 + 安卓系统,YOLO RKNN 模型实时推理保姆级教程
android·人工智能·yolo·目标跟踪·瑞芯微·嵌入式驱动
2301_764441338 分钟前
使用python构建的STAR实验ΛΛ̄自旋关联完整仿真
开发语言·python·算法
共享家95279 分钟前
Java入门( 异常 )
java·开发语言·php
御形封灵11 分钟前
基于canvas的路网编辑交互
开发语言·javascript·交互
xifangge202513 分钟前
Python 爬虫实战:爬取豆瓣电影 Top250 数据并进行可视化分析
开发语言·爬虫·python
SunnyDays101114 分钟前
C# 实战:快速查找并高亮 Word 文档中的文字(普通查找 + 正则表达式)
开发语言·c#
kaoshi100app17 分钟前
本周,河南二建报名公布!
开发语言·人工智能·职场和发展·学习方法
421!18 分钟前
ESP32学习笔记之GPIO
开发语言·笔记·单片机·嵌入式硬件·学习·算法·fpga开发