You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 16:38:19