Kotlin 枚举类(enum classes)条目映射的值类型及判断方法
Kotlin枚举类条目值及类型判断说明
你的猜测是正确的,你当前场景下用来匹配URL参数的就是枚举条目的字面名字符串。关于Kotlin枚举条目对应的值和类型,你可以按以下规则判断:
1. 无自定义构造的枚举默认属性
你定义的OpenCommandTypes没有自定义构造参数,属于最基础的枚举类,每个枚举条目本质是OpenCommandTypes类型的单例对象,默认自带两个公共属性:
name:String类型,值就是你定义枚举时写的条目标字面量,比如OpenCommandTypes.PURCHASE_ORDER.name的值就是字符串"PURCHASE_ORDER"ordinal:Int类型,值为枚举条目的定义顺序,从0开始计数,ADD_META_DATA的ordinal是0,PURCHASE_ORDER的ordinal是1
你代码里用的OpenCommandTypes.valueOf(type)方法,就是拿传入的字符串和所有枚举条目的name属性做精确匹配,匹配成功就返回对应的枚举实例,所以可以直接用来校验URL里的命令名称。
2. 自定义属性的枚举值判断
如果枚举类定义了自定义构造参数,每个枚举条目就可以持有你指定的业务值,类型由构造参数的类型决定,示例如下:
// 自定义枚举,持有String类型的value属性 enum class OpenCommandTypes(val value: String) { ADD_META_DATA("add_meta_data"), // 对应业务值为小写字符串 PURCHASE_ORDER("purchase_order"); }
这种场景下你不能直接用valueOf匹配自定义的业务值,需要自己遍历枚举条目匹配对应字段:
fun safeOpenCommandType(type: String): Either<Exception, OpenCommandTypes> = OpenCommandTypes.values().firstOrNull { it.value == type } ?.right() ?: IllegalArgumentException().left()
3. 快速验证枚举值类型的方法
你可以直接通过代码测试枚举的属性类型:
fun main() { val orderType = OpenCommandTypes.PURCHASE_ORDER // 验证枚举实例本身的类型 println(orderType is OpenCommandTypes) // 输出true // 验证默认属性类型 println(orderType.name is String) // 输出true println(orderType.ordinal is Int) // 输出true }
另外你代码里when(openCommandType)分支匹配的是枚举单例对象本身,不是字符串,只是你提前通过valueOf把URL里的字符串转成了对应的枚举实例,所以才能匹配成功。
内容的提问来源于stack exchange,提问作者Leff
相关产品推荐
相关产品推荐

