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
相关产品推荐
相关产品推荐

