🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
## 枚举类——[kotlin.Enum](https://www.w3cschool.cn/doc_kotlin/kotlin-api-latest-jvm-stdlib-kotlin--enum-index.html) [TOC] ### 枚举定义 **枚举类的最基本的用法是实现类型安全的枚举**。 ~~~ enum class Direction { NORTH, SOUTH, WEST, EAST } ~~~ 现实生活中,说星期我们知道只有“星期一、星期二、星期三、星期四、星期五、星期六、星期日”七种情况。说扑克牌花色我们知道只有“黑桃、红心、樱花、方块”四种情况。说性别我们知道只有“男性、女性”。 **星期**只有**星期一、星期二、星期三、星期四、星期五、星期六、星期日**七种情况。我们可以通过接口加常量定义的方式来表示,比如我们可以这样有如下定义,参考代码: ``` public interface IWeek {     String MON = "Mon";     String TUE = "Tue";     String WED = "Wed";     String THU = "Thu";     String FRI = "Fri";     String SAT = "Sat";     String SUN = "Sun"; } ``` Iweek的接口的特点是什么呢?就是一个类或者接口拥有有限的常量。如果一个类或者接口拥有有限的常量,除了这样的定义方式,我们还可以选择用更为强大的枚举类。**因为枚举类达到同样的限定效果之外,还提供了更多的方法和属属性。** * 枚举类通过enum关键字完成,enum关键字添加在class关键字的前面,枚举的基本结构如下: ``` enum class Class{    枚举常量1,枚举常量2,枚举常量3,枚举常量4 } ``` >[info]【注意】:这是极少数Kotlin 声明比Java 使用了更多关键字的例子: Kotlin 用了enum class 两个关键字,而Java 只有enum 一个关键字。Kotlin 中,enum 是一个所谓的软关键字:只有当它出现在class 前面时才有特殊的意义,在其他地方可以把它当作普通的名称使用。与此不同的是, class 仍然是一个关键字,要继续使用名称clazz 和aClass 来声明变量。 * **通常枚举常量使用大写字母表示**。 * **初始化** 因为每⼀个枚举都是枚举类的实例,因此这些实例也可以初始化,同时枚举支持构造函数,因此可以使用构造函数来初始化: ``` enum class Color(val rgb: Int) { RED(0xFF0000), GREEN(0x00FF00), BLUE(0x0000FF) } ``` ### 示例 #### **示例1** 我们定义一个枚举类Week,参考代码: ~~~ enum class Week{ MON,TUE,WED,THU,FRI,SAT,SUN } fun printInfo(c:Week){ if (c ==Week.SAT||c==Week.SUN){ println("今天是周末") }else{ println("今天是工作日") } } fun main(args: Array<String>) { printInfo(Week.WED) } ~~~ 运行结果 ``` 今天是工作日 Process finished with exit code 0 ``` #### **示例2** ~~~ fun main(args: Array<String>) { println(Color.BLUE.rgb()) } enum class Color(val r:Int ,val g:Int ,val b:Int){ //在每个常量创建的时候指定属性值 RED(255,0,0),ORANGE(255,165,0),YELLOW(255,255,0), GREEN(0,255,0),BLUE(0,0,255),INDIGO(75,0,130), VIOLET(238,130,238);//这里必须要有分号 //给枚举类定义一个方法 fun rgb()=(r *256 + g) * 256 + b } ~~~ 枚举常量用的声明构造方法和属性的语法与之前你看到的常规类一样。当你声明每个枚举常量的时候,必须提供该常量的属性值(参考下面的枚举类自定义属性)。注意这个例子向你展示了Kotlin语法中唯一必须使用分号的地方: 如果要在枚举类中定义任何方法,就要使用分号把枚举常量列表和方法定义分开。 ### **枚举类自定义属性** 我们知道,**默认每一个枚举常量就带了一个name和ordinal的属性**。 我们**还可以通过枚举类自定义属性,让每一个枚举常量携带更多的属性。而且kotlin更为方便,直接在主构函数里面,定义你想定义的其他属性即可**,参考代码: ~~~ enum class Week(val what: String, val doSomething: String) { MON("周一", "上班"), TUE("周二", "上班"), WED("周三", "上班"), THU("周四", "上班"), FRI("周五", "上班"), SAT("周六", "休息"), SUN("周日", "休息") } fun main(args: Array<String>) { //周一 val mon = Week.MON //周六 val sat = Week.SAT println("-------Week.MON-------") println("mon.name:${mon.name}") println("mon.ordinal:${mon.ordinal}") println("mon.what:${mon.what}") println("mon.doSomething:${mon.doSomething}") println("-------Week.SAT-------") println("sat.name:${sat.name}") println("sat.ordinal:${sat.ordinal}") println("sat.what:${sat.what}") println("sat.doSomething:${sat.doSomething}") } ~~~ 运行结果 ``` -------Week.MON------- mon.name:MON mon.ordinal:0 mon.what:周一 mon.doSomething:上班 -------Week.SAT------- sat.name:SAT sat.ordinal:5 sat.what:周六 sat.doSomething:休息 Process finished with exit code 0 ``` 上述代码中,每个枚举都通过构造函数进行了初始化,计划了一周中每天要干的事情。如果需要对枚举进行初始化,则枚举类后面的括号中必须传递每个枚举需要初始化的参数。