
在 Kotlin 中无法直接通过变量名(如字符串)访问 const val 常量,但可通过枚举类 + valueOf() 安全实现名称到值的映射,兼顾类型安全、可维护性与跨模块复用性。
在 kotlin 中无法直接通过变量名(如字符串)访问 `const val` 常量,但可通过枚举类 + `valueof()` 安全实现名称到值的映射,兼顾类型安全、可维护性与跨模块复用性。
Kotlin 不支持类似 JavaScript 的 obj[variableName] 或 Java 反射式动态字段访问(尤其对 const val),因为 const val 在编译期内联为字面量,运行时无反射信息。强行使用反射不仅低效、易出错,还违背 Kotlin 的设计哲学。
✅ 推荐方案:使用枚举类(enum class)替代 object 常量对象
枚举天然支持按名称查找(Props.valueOf("A2"))、序号索引(.ordinal)和遍历(.values()),且具备强类型、不可变、线程安全等优势,完美适配你的场景:
enum class Props(val value: Int) {
A1(1), A2(2), A3(3); // 可扩展任意数量,支持关联数据
companion object {
// 可选:提供统一的字符串解析入口(带错误处理)
fun fromName(name: String): Props? = try {
valueOf(name)
} catch (e: IllegalArgumentException) {
null
}
}
}
在 UI 选择回调中使用:
override fun onItemSelected(parent: AdapterView, view: View?, pos: Int, id: Long) {
val selectedItem = parent.getItemAtPosition(pos).toString() // e.g. "A2"
userOption = selectedItem
}
private fun getIndexUserOption(): Int? {
return Props.fromName(userOption)?.value // ✅ 返回实际数值 1/2/3,非 ordinal
}
⚠️ 注意事项:
- Props.valueOf("Invalid") 会抛出 IllegalArgumentException,务必用 try-catch 或 companion 中封装的安全方法;
- 若需保持 0 起始序号(如 A1 → 0),可用 .ordinal;若需自定义值(如 A1 → 1),务必使用关联属性(如上例 value: Int);
- 枚举类天然支持多模块共享——只需将 enum class Props 声明在公共 module 中,其他模块 import 即可直接使用,无需重复定义字典;
- 避免反模式:不要用 Map
手动维护映射,既冗余又易与常量定义脱节。
? 总结:放弃“动态字段名访问”的思维惯性,拥抱 Kotlin 的类型系统。枚举是表达有限命名常量集的标准、安全、可扩展方案,比反射或字符串映射更符合工程实践。










