Kotlin 枚举类 enum

 枚举类就是一组命名的常数,是指将变量的值一一列出来,变量的值只限于列举出来的值的范围内.

枚举类的最基本的用法是实现类型安全的枚举:

enum class Direction {
    NORTH, SOUTH, WEST, EAST
}

每个枚举常量都是一个对象。枚举常量用逗号分隔。

那枚举类怎么用呢?

println(Direction.EAST.name)

打印结果:

EAST

用 .name 就直接拿到枚举常量本身的字符串。

每个枚举常量都具有在枚举类声明中获取其名称与位置的属性:

val name: String
val ordinal: Int

就是说每个枚举类中的常量都可以 .name 拿到名称, .ordinal 拿到位置。

==========================================================================

那枚举如何使用 Int,boolean等其他类型呢?你可以使用参数初始化枚举类

enum class Season(val temperature: Int) {

    SPRING(1),
    SUMMER(2),
    AUTUMN(3),
    WINTER(4),

}

println("name: ${Season.SPRING.name} , temperature: ${Season.SPRING.temperature}")

打印结果:
name: SPRING , temperature: 1
enum class Week(val index: Int, val aliasName: String) {
    MONDAY(1, "Mon"),
    TUESDAY(2, "Tue"),
    WEDNESDAY(3, "Wed"),
    THURSDAY(4, "Thu"),
    FRIDAY(5, "Fri"),
    SATURDAY(6, "Sat"),
    SUNDAY(7, "Sun")
}

println("${Week.MONDAY.name} :  " +
            " index ${Week.MONDAY.index} , aliasName: ${Week.MONDAY.aliasName}")
打印结果:
MONDAY :   index 1 , aliasName: Mon

==========================================================================

枚举类可以实现接口

interface MyInterface1 {
    fun myMethod1(num: Int)
}

interface MyInterface2 {
    fun myMethod2(num: Int)
}

enum class MyEnumClass : MyInterface1, MyInterface2 {
    OPERATE1 {
        override fun myMethod2() {
            println("OPERATE1 对 myMethod2 的特殊实现 ")
        }
    },
    OPERATE2 {
        override fun myMethod2() {
            println("OPERATE2 对 myMethod2 的特殊实现 ")
        }
    };

    override fun myMethod1() {
        println("MyEnumClass 对 myMethod1 的统一实现 ")
    }

}

主函数
fun main() {

    MyEnumClass.OPERATE1.myMethod1()
    MyEnumClass.OPERATE2.myMethod1()
    MyEnumClass.OPERATE1.myMethod2()
    MyEnumClass.OPERATE2.myMethod2()

}
打印结果:
D:\AndroidStudio\android-studio\jre\bin\java.exe
MyEnumClass 对 myMethod1 的统一实现 
MyEnumClass 对 myMethod1 的统一实现 
OPERATE1 对 myMethod2 的特殊实现 
OPERATE2 对 myMethod2 的特殊实现 

Process finished with exit code 0
myMethod1 是在 MyEnumClass 中统一实现的,OPERATE1,OPERATE2 没有自己实现,但是也是可以调用的。
myMethod2 是在 OPERATE1,OPERATE2 中有不同的处理。

那如果 myMethod1 在 MyEnumClass 中有统一实现,那 OPERATE1 或者 OPERATE2 还可不可以重载 myMethod1呢?

答案是可以,在调用的时候会执行自己的特殊实现,而不会执行 MyEnumClass中的统一实现

interface MyInterface1 {
    fun myMethod1(num: Int)
}

interface MyInterface2 {
    fun myMethod2(num: Int)
}

enum class MyEnumClass : MyInterface1, MyInterface2 {
    OPERATE1 {
        override fun myMethod2() {
            println("OPERATE1 对 myMethod2 的特殊实现 ")
        }
    },
    OPERATE2 {
        这里也实现了 myMethod1
        override fun myMethod1() {
            println("OPERATE2 对 myMethod1 的特殊实现 ")
        }

        override fun myMethod2() {
            println("OPERATE2 对 myMethod2 的特殊实现 ")
        }
    };

    override fun myMethod1() {
        println("MyEnumClass 对 myMethod1 的统一实现 ")
    }

}

主函数
fun main() {

    MyEnumClass.OPERATE1.myMethod1()
    MyEnumClass.OPERATE2.myMethod1()
    MyEnumClass.OPERATE1.myMethod2()
    MyEnumClass.OPERATE2.myMethod2()

}
打印结果:
D:\AndroidStudio\android-studio\jre\bin\java.exe
MyEnumClass 对 myMethod1 的统一实现 
OPERATE2 对 myMethod1 的特殊实现 
OPERATE1 对 myMethod2 的特殊实现 
OPERATE2 对 myMethod2 的特殊实现  

Process finished with exit code 0

OPERATE2 在调用myMethod1 的时候打印结果变成: OPERATE2 对 myMethod1 的特殊实现

==========================================================================

猜你喜欢

转载自blog.csdn.net/u011288271/article/details/108442853