原创

Kotlin中的枚举类

Kotlin也支持枚举类

一、枚举类入门

Kotlin使用enum class关键字组合定义枚举类。这是一种特殊的类,它可以有自己的属性、方法,可以实现一个或多个接口,也可以定义自己的构造器。

与普通类的区别:

  • 枚举类可以实现一个或多个接口,使用enum定义的枚举类默认继承kotlin.Enum类,而不是默认继承Any类,因此枚举类不能显式继承其他父类。其中Enum类实现了kotlin.Comparable接口。
  • 使用enum定义的非抽象的枚举类不能使用open修饰,因此枚举类不能派生子类。
  • 枚举类的构造器只能使用private访问控制符,如果省略了构造器的访问控制符,则默认使用private修饰;如果强制指定访问控制符,则只能指定private修饰符。
  • 枚举类的所有实例必须在枚举类的第一行显式列出,否则这个枚举类用于都不能产生实例。
enum class Season{
    //在第一行列出4个枚举实例
    SPRING,SUMMER,FALL,WINTER
}
fun main(args: Array<String>) {
    //枚举类默认有一个values()方法,返回该枚举类的所有实例
    for (s in Season.values()) {
        println(s)
    }

    val seasonName = "SUMMER"
    val s: Season = Season.valueOf(seasonName)
    println(s)

    //直接访问枚举值
    println(Season.WINTER)
}

输出结果:

SPRING
SUMMER
FALL
WINTER
SUMMER
WINTER

二、枚举类的属性、方法和构造器

如果枚举类显式定义了带参数的构造器,在列出枚举值时就必须对应地传入参数。

//使用主构造器声明cnName只读属性
enum class Gender(val cnName: String) {
    MALE("男"), FEMALE("女");

    //定义方法
    fun info() {
        when (this) {
            MALE -> println("男子汉顶天立地")
            FEMALE -> println("窈窕淑女")
        }
    }
}
fun main(args: Array<String>) {
    //通过Gender的valueOf()方法根据枚举名获取枚举值
    val g = Gender.valueOf("FEMALE")
    //访问枚举值的cnName属性
    println("${g}代表:${g.cnName}")
    //调用info方法
    g.info()
}

输出结果:

FEMALE代表:女
窈窕淑女

三、实现接口的枚举类

枚举类也可以实现一个或多个接口。


interface GenderDesc {
    fun info()
}

//使用主构造器声明cnName只读属性
enum class Gender(val cnName: String) : GenderDesc {
    MALE("男"), FEMALE("女");

    //重写接口中定义的抽象方法
    override fun info() {
        when (this) {
            MALE -> println("男子汉顶天立地")
            FEMALE -> println("窈窕淑女")
        }
    }
}

四、包含抽象方法的抽象枚举类

package `0705`

enum class Operation {
    PLUS {
        override fun eval(x: Double, y: Double): Double = x + y
    },
    MINUS {
        override fun eval(x: Double, y: Double): Double = x - y
    },
    TIMES {
        override fun eval(x: Double, y: Double): Double = x * y
    },
    DIVIDE {
        override fun eval(x: Double, y: Double): Double = x / y
    };

    //为枚举类定义一个抽象方法
    //这个抽象方法由不同的枚举值提供不同的实现
    abstract fun eval(x: Double, y: Double): Double
}

fun main(args: Array<String>) {
    println(Operation.PLUS.eval(8.0, 4.0))
    println(Operation.MINUS.eval(8.0, 4.0))
    println(Operation.TIMES.eval(8.0, 4.0))
    println(Operation.DIVIDE.eval(8.0, 4.0))
}

输出结果:

12.0
4.0
32.0
2.0

枚举类中包含抽象方法时依然不可以使用abstract修饰枚举类,在定义每个枚举值时必须为抽象成员提供实现,否则将出现编译错误。

学海无涯苦作舟

我的微信公众号.jpg

基本语法
  • 作者:HunterArley (联系作者)
  • 发表时间:2019-11-26 10:46
  • 版权声明:本网站部分内容转载于合作站点或其他站点,但都会注明作/译者和原出处。如有不妥之处,敬请指出。
  • 公众号转载:请在文末添加作者公众号二维码