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

Android Kotlin:如何用设计模式复用多枚举类的处理逻辑?

问题背景代码

枚举类 NamesEnum.kt

enum class NamesEnum(
    val option : String
) {
    AAkASH("Aakash Gupta"),
    ADITI("Aditi Deshpande")
}

枚举类 StateEnum.kt

enum class StateEnum(
    val option : String
) {
    KAR("Karnataka"),
    MAH("Maharashtra")
}

数据类 StudentData.kt

data class StudentData(
    var student1: String = "",
    var student2: String = "",
    var state1: String = "",
    var state2: String = "",
   
){
    companion object{
        private var EMPTY_OBJECT: StudentData? = null
        fun getInstance(): StudentData? {
            if (EMPTY_OBJECT == null) EMPTY_OBJECT = StudentData()
            return EMPTY_OBJECT
        }
        fun clearReference(){
            EMPTY_OBJECT = null
        }
    }
}

当前处理函数

fun updateData() : List<String>
{
  val list = NamesEnum.values()
        val nameList = ArrayList<String>()
        for (item in list){
            nameList.add(item.option)
        }
        return optionList // 原代码存在笔误,实际应返回nameList
}
解决方案:用「抽象接口+泛型」实现通用逻辑(本质是策略模式思路)

要避免为每个枚举重复编写遍历逻辑,核心是先统一所有枚举的公共行为,再编写通用处理函数:

第一步:定义统一行为接口

先写一个接口,约定所有需要处理的枚举必须包含option属性:

interface OptionProvider {
    val option: String
}

第二步:让现有枚举实现接口

修改NamesEnum和StateEnum,让它们实现上述接口:

enum class NamesEnum(
    override val option : String
) : OptionProvider {
    AAkASH("Aakash Gupta"),
    ADITI("Aditi Deshpande")
}

enum class StateEnum(
    override val option : String
) : OptionProvider {
    KAR("Karnataka"),
    MAH("Maharashtra")
}

第三步:编写通用枚举处理函数

利用Kotlin泛型约束,限定传入的枚举必须同时是枚举类型和OptionProvider实现类,这样就能一次性处理所有符合要求的枚举:

inline fun <reified T : Enum<T> & OptionProvider> getEnumOptions(): List<String> {
    return enumValues<T>().map { it.option }
}

第四步:用通用函数更新StudentData

现在不管是名字枚举还是状态枚举,都能用同一个函数获取选项列表,再更新数据类:

fun updateStudentData() {
    val nameList = getEnumOptions<NamesEnum>()
    val stateList = getEnumOptions<StateEnum>()
    
    StudentData.getInstance()?.run {
        student1 = nameList.getOrElse(0) { "" }
        student2 = nameList.getOrElse(1) { "" }
        state1 = stateList.getOrElse(0) { "" }
        state2 = stateList.getOrElse(1) { "" }
    }
}

方案优势

  • 遵循开放封闭原则:以后新增同类枚举,只需要让它实现OptionProvider接口,无需修改通用函数的代码。
  • 本质是策略模式的思路:把不同枚举的遍历逻辑抽象成可复用的通用策略,切换枚举类型只需更换泛型参数,完全避免重复代码。

内容的提问来源于stack exchange,提问作者Nikitha

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 14:07:45