
Kotlin 不支持类似 Properties.$userOption 的动态常量访问语法,但可通过定义带序号或属性的枚举类安全、高效地实现相同语义——避免反射、无需 Map 全局维护,且天然支持跨类复用。
kotlin 不支持类似 `properties.$useroption` 的动态常量访问语法,但可通过定义带序号或属性的枚举类安全、高效地实现相同语义——避免反射、无需 map 全局维护,且天然支持跨类复用。
在 Kotlin 中,直接通过字符串变量名(如 "A1")访问 object 中的 const val 是不被语言支持的——这本质上属于运行时反射行为,而 const val 在编译期即内联,无运行时元数据可供查询;同时 Kotlin 也不提供类似 JavaScript 的 obj[variableName] 动态属性访问机制。
✅ 推荐方案:使用 enum class 替代 object 常量容器
枚举天然具备名称映射、序号索引和类型安全三大优势,且无需额外依赖或反射开销:
enum class Properties {
A1, A2, A3, A4, A5 // 可扩展至 An
}
// 获取用户选择的字符串(如 "A2")对应的枚举实例
fun parseUserOption(optionName: String): Properties? {
return Properties.values().find { it.name == optionName }
}
// 示例用法
val userOption = "A3"
val selected = parseUserOption(userOption)
val index = selected?.ordinal ?: -1 // A1 → 0, A2 → 1, A3 → 2...
println("Index: $index") // 输出: Index: 2
⚠️ 注意事项:
- enumClass.values() 每次调用会返回新数组,高频场景建议缓存为 val ALL = values();
- name 匹配区分大小写,若 UI 显示名与枚举名不一致(如显示 "Option 1"),可为枚举添加自定义属性:
enum class Properties(val displayName: String) {
A1("Option 1"),
A2("Option 2"),
A3("Option 3");
companion object {
fun fromDisplayName(name: String): Properties? =
values().find { it.displayName == name }
}
}
? 总结:
不要尝试用字符串拼接或反射模拟 Properties.$userOption——它违背 Kotlin 的静态类型设计哲学,且在 JVM/Android 上性能差、易出错。使用 enum class 是语义清晰、编译安全、跨模块复用性强的标准解法。所有需要“命名常量 + 运行时选择”的场景,均应优先建模为枚举。










