用 const val 定义字段标识,配合编译期绑定与 jvm 内联,使访问降为内存偏移读取;通过属性引用固化路径,避免运行时反射解析;以 sealed class + when 替代 map 查找,实现编译期分支优化;跨模块字段索引由 configkeys.kt 统一保障,编译期校验、ide 支持、零运行时异常。

直接用 const val 定义字段标识,配合编译期绑定和 JVM 内联机制,让访问变成纯内存偏移读取,彻底跳过运行时字符串匹配查找。
用 const val 替代字符串字面量作字段标识
把原本用于反射或 Map 查找的字符串 key(如 "user_name"、"timeout_ms")全部改为 Kotlin 的 const val 声明:
const val USER_NAME = "user_name"const val TIMEOUT_MS = "timeout_ms"
这些值在编译期就写入 class 文件常量池,类加载时直接映射为 JVM 运行时常量池中的直接引用——不参与任何哈希计算、字符串比对或 Map 遍历。
用属性引用来固化访问路径,避免每次反射解析
真正读写配置字段时,不走 KClass.memberProperties.find { it.name == USER_NAME } 这类运行时遍历,而是提前缓存编译期生成的属性引用:
- 在伴生对象或顶层 object 中声明:
val nameProp = Config::userName - 该引用是编译期确定的常量对象,类加载时完成解析,后续所有调用复用同一实例
- 访问时调用
nameProp.get(configInstance),JIT 编译后等价于普通字段读取,无符号解析、无安全检查开销
用 sealed class + when 替代 Map.get(key) 的字典式分发
当业务逻辑需根据配置字段语义做分支处理(如序列化白名单、权限校验字段路由),别用 Map<string t></string> 存储再按 key 查找:
- 定义
sealed class ConfigField,子类如object UserName : ConfigField()、object TimeoutMs : ConfigField() - 用
when (field) { is UserName -> ...; is TimeoutMs -> ... }分支处理 - JVM 对 sealed class 的 when 会在编译期尝试优化为跳转表或内联分支,完全绕过字符串哈希与 Map 查找
跨模块字段索引统一由编译期契约保障
不同模块间共享配置字段名时,不再靠文档约定或硬编码字符串,而是通过一个公共的 ConfigKeys.kt 模块导出 const val 和 sealed class:
- 各模块依赖该模块,编译期即可校验字段是否存在、拼写是否一致
- IDE 能自动补全、重命名同步、编译报错拦截非法字段引用
- 运行时无任何“字段不存在”异常,因为所有访问路径在类加载阶段已固化










