Kotlin中如何通过变量名访问对象内的常量值
问题描述
我在Kotlin中定义了一个包含多常量的单例对象:
object Properties { const val A1 = 1 const val A2 = 2 const val A3 = 3 // ... 其他常量 }
用户在应用里选择A1、A2这类选项后,我会把选中项的名称存在userOption字符串变量中。现在想通过userOption的值直接访问Properties里对应的常量,比如想写类似val index = Properties.$userOption的代码,但这种写法根本行不通。
举个实际场景:用户在Spinner中选完选项后,选中项存入userOption,我在getIndexUserOption方法里尝试获取对应常量值,现在写的val indexUser = Properties.$userOption完全实现不了需求。
备注:我不想用字典来做映射,因为这个常量集合要在多个类里复用。
解决方案
方案1:用反射动态获取常量(不修改现有结构)
要是不想改动现有的Properties对象,可以用Kotlin反射根据字段名获取对应常量值:
首先确保项目引入了反射依赖(Android项目默认包含;普通JVM项目需要在build.gradle.kts中添加):
dependencies { implementation(kotlin("reflect")) }
然后写一个工具函数来获取值:
fun getPropertyValue(option: String): Int { return Properties::class.memberProperties .filterIsInstance<KProperty0<Int>>() .firstOrNull { it.name == option } ?.get() ?: throw IllegalArgumentException("无效选项:$option") }
调用的时候直接传userOption就行:
val userOption = "A1" val index = getPropertyValue(userOption) // 返回1
注意:反射有一定性能开销,如果是高频调用的场景,不太推荐这种方式。
方案2:重构为枚举类(更推荐)
比起反射,枚举类更适合这种键值对应且需要复用的场景,类型安全还没性能问题:
enum class Option(val value: Int) { A1(1), A2(2), A3(3); // ... 其他枚举项 companion object { fun fromName(name: String): Option { return entries.firstOrNull { it.name == name } ?: throw IllegalArgumentException("无效选项:$name") } } }
调用方式很简单:
val userOption = "A1" val index = Option.fromName(userOption).value // 返回1
这种方式不仅能通过名称获取对应值,还能在多个类里直接复用Option枚举,完全满足复用需求,而且编译期就能检查错误,比反射靠谱多了。
内容的提问来源于stack exchange,提问作者ladytoky0
相关产品推荐
相关产品推荐

