Kotlin枚举类中三种调用常量名称方法的区别及用法
Kotlin枚举类三种写法的区别
这三个表达式虽然打印结果相同,但它们的本质、返回类型和适用场景有明显区别:
1. Direction.valueOf("NORTH")
- 这是枚举类自带的静态工具方法,作用是通过枚举常量的名称字符串,反向获取对应的枚举实例。
- 返回类型是
Direction枚举实例,println时会调用枚举默认的toString()方法,而枚举默认toString()返回的就是实例的name属性值,所以打印出NORTH。 - 注意:如果传入的字符串没有对应的枚举常量(比如传"NORTH1"),会直接抛出
IllegalArgumentException。 - 适用场景:当你只有字符串形式的枚举名称时(比如从配置文件、接口返回值中拿到的字符串),需要把它转换成枚举实例的时候用。
2. Direction.NORTH
- 这是直接引用枚举类的常量实例,是获取枚举实例最直接、最常用的方式。
- 返回类型是
Direction枚举实例,同样因为println调用默认toString(),所以输出NORTH。 - 适用场景:在代码中明确知道要使用哪个枚举常量时,直接引用即可,类型安全且性能最优。
3. Direction.NORTH.name
- 这是访问枚举实例自带的**
name属性**,每个枚举实例都默认拥有这个属性,它的值就是定义枚举常量时的标识符(也就是NORTH这个字符串)。 - 返回类型是
String,所以println直接输出这个字符串值。 - 适用场景:当你需要获取枚举常量的名称字符串时使用,比如要把枚举名称存到数据库、或者作为参数传递给需要字符串的方法时。
举个更直观的例子区分三者:
fun main() { // valueOf得到实例,能访问枚举的自定义属性direction和distance val northInstance = Direction.valueOf("NORTH") println(northInstance.distance) // 输出20 // 直接引用实例,同样能访问自定义属性 println(Direction.NORTH.direction) // 输出North // name只是字符串,无法访问枚举的自定义属性 val northName = Direction.NORTH.name // println(northName.distance) // 编译报错,String没有distance属性 }
内容的提问来源于stack exchange,提问作者sayang_android
相关产品推荐
相关产品推荐

