Kotlin Data Class 借助Enum枚举实现语言代码映射显示名问题咨询
实现方案
步骤1:修正枚举定义
你当前的枚举属性定义有误,需要拆分语言代码和标准显示名为两个独立属性,同时新增匹配工具方法:
enum class ClosedCaptionLanguages(val code: String, val standardDisplayName: String) { ENG("eng", "English"), ZHO("zho", "Chinese"); companion object { // 按语言代码忽略大小写匹配枚举条目,适配不同大小写的输入场景 fun findByCode(code: String): ClosedCaptionLanguages? { return values().find { it.code.equals(code, ignoreCase = true) } } // 若你需要按传入的显示名匹配,可新增此方法 fun findByDisplayName(displayName: String): ClosedCaptionLanguages? { return values().find { it.standardDisplayName.equals(displayName, ignoreCase = true) } } } }
步骤2:实现data class逻辑
通过私有原始参数+公开处理后属性的方式,统一处理主/次构造的显示名替换逻辑,避免代码冗余:
data class ClosedCaptionOn( val languageCode: String, // 私有属性接收原始传入的显示名,不对外暴露 private val rawLanguageDisplay: String ) : ClosedCaptionOptions() { // 对外暴露的最终标准显示名,统一做替换处理 val languageDisplay: String = findByCode(languageCode)?.standardDisplayName ?: rawLanguageDisplay // 次构造仅传语言代码的场景,默认用语言代码作为兜底显示名 constructor(languageCode: String) : this(languageCode, languageCode) companion object { // 导入枚举的匹配方法简化调用 private fun findByCode(code: String) = ClosedCaptionLanguages.findByCode(code) } }
逻辑说明
- 无论调用主构造传两个参数还是次构造传单个参数,最终返回的
languageDisplay都会优先匹配枚举中对应语言代码的标准显示名,没有匹配到的场景才会使用原始传入的显示值。 - 如果你需求是按传入的显示名匹配而非按语言代码匹配,只需将
languageDisplay的赋值逻辑替换为findByDisplayName(rawLanguageDisplay)?.standardDisplayName ?: rawLanguageDisplay即可。
内容的提问来源于stack exchange,提问作者JPM
相关产品推荐
相关产品推荐

