如何修复枚举类伴生对象函数,按Locale返回Map对应列表?
修复ReservationFrequencies枚举的getReservationFrequencies函数
先梳理原代码里的核心问题:
- 伴生函数里
reservationFrequencies是未定义变量,实际上枚举只有APPLICATION这一个实例,应该直接用它的frequencies映射表 - 强制用
locale!!拆包会触发空指针异常,必须处理locale为null的情况 - 错误调用
ReservationFrequency.add,且构造参数传递完全错误——it.frequencies是Map类型,和ReservationFrequency的构造参数不匹配 - 匹配逻辑错误:试图用
ReservationFrequency的name去匹配locale,完全不符合需求,我们需要把传入的locale字符串转成Language枚举,再去映射表里取值
下面是修复后的完整代码:
enum class Language { en, ar } data class ReservationFrequency(val code: Int, val label: String, val value: Int) enum class ReservationFrequencies(val frequencies: Map<Language, List<ReservationFrequency>>) { APPLICATION(mapOf( Language.en to listOf( ReservationFrequency(0,"once",0), ReservationFrequency(1,"Monthly",2), ReservationFrequency(2,"Quarterly",5), ReservationFrequency(3,"Semi-annually",5), ReservationFrequency(4,"Annually",5) ), Language.ar to listOf( ReservationFrequency(0,"مرة واحده",0), ReservationFrequency(1,"شهرياً",2), ReservationFrequency(2,"ربع سنوياً",5), ReservationFrequency(3,"نصف سنوياً",5), ReservationFrequency(4," سنوياً",5) ) )); companion object { fun getReservationFrequencies(locale: String?) : List<ReservationFrequency> { // 处理null/空字符串,默认返回英文列表 val targetLang = locale?.trim()?.lowercase()?.let { langStr -> Language.values().firstOrNull { it.name.lowercase() == langStr } } ?: Language.en // 从映射表取对应列表,找不到则返回空列表(也可改成返回默认英文) return APPLICATION.frequencies[targetLang] ?: emptyList() } } }
关键修复点说明:
- 补全了
Language枚举和ReservationFrequency数据类的定义(原代码应有这些结构,补全后代码可直接运行) - 用
locale?.trim()?.lowercase()统一处理输入的locale字符串,避免大小写或空格导致匹配失败 - 通过
Language.values().firstOrNull将字符串转成Language枚举实例,兼容找不到对应语言的场景 - 直接从
APPLICATION.frequencies映射表取值,逻辑简洁直接 - 处理了
locale为null的场景,默认返回英文列表,可根据需求调整为返回空列表
内容的提问来源于stack exchange,提问作者Fares Mahmoud
相关产品推荐
相关产品推荐

