Kotlin专题「十七」:枚举类(enum class)

前言:前行的路,不怕万人阻挡,只怕自己投降;人生的帆,不怕狂风巨浪,只怕自己没胆量。

一、概述

枚举类最基本的用法是实现类型安全的。枚举类使用 enum 关键字修饰:

    enum class Direction {
    
    //使用 enum 关键字修饰,在类头 class 前
        NORTH, SOUTH, WEST, EAST
    }

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

	fun test() {
    
    
	    Direction.NORTH
        Direction.SOUTH
        Direction.WEST
        Direction.EAST
	}

不需要实例化枚举类就可以访问枚举常量,通过 枚举类.常量名 调用。

因为每一个枚举都是枚举类的一个实例,所以它们可以是初始化过的。

    enum class Color(val rgb: Int) {
    
    
        RED(0xFF0000),
        GREEN(0x00FF00),
        BLUE(0x0000FF)
    }

通过枚举类构造函数,那么每一个枚举都有该构造函数,并且需要初始化值。比如上面的 RED(rgb: Int),需要初始化值。

二、枚举常量的匿名类

枚举常量还可以用它们对应的方法声明它们自己的匿名类,以及覆盖基本方法。

    enum class ConsoleColor(var argb: Int) {
    
    
        RED(0xFF0000) {
    
    
            override fun print() {
    
    //必须重写的
                println("枚举常量 RED")
            }
        },
        WHITE(0xFFFFFF) {
    
    
            override fun print() {
    
    
                println("枚举常量 WHITE")
            }
        },
        BLACK(0x000000) {
    
    
            override fun print() {
    
    
                println("枚举常量 BLACK")
            }
        },//枚举常量之间使用逗号“,”分隔,最后一个常量必须使用分号“;”分隔
        GREEN(0x00FF00) {
    
    
            override fun print() {
    
    
                println("枚举常量 GREEN")
            }
        };

        abstract fun print()//抽象方法,定义在枚举类内部,而且必须在枚举常量后面
    }
  • 枚举常量之间使用逗号 , 分隔,如果还定义有任何成员(变量和方法),则使用分号 ; 将常量定义和成员定义分隔;
  • 必须提供一个抽象方法,定义在枚举类内部,而且必须在枚举常量后面。
	fun test() {
    
    
	    ConsoleColor.BLACK
	}

打印数据如下:

枚举常量 BLACK

注意:枚举类不能包含内部类以外的嵌套类型。

三、在枚举类中实现接口

和 Java 一样,Kotlin 的枚举类可以实现接口。一个枚举类可以实现一个接口,为所有枚举常量提供一个接口成员的实现,或者为其匿名类中的每个条目提供单独的接口成员实现。这是通过枚举类声明中添加接口来实现的。如下:

    interface ShareListener {
    
    
        fun invite()
    }

    enum class State : ShareListener {
    
    
        NORMAL {
    
    
            override fun invite() {
    
    
                println("实现接口 NORMAL")
            }
        },
        ERROR;

        override fun invite() {
    
    
            println("实现接口 enum")
        }
    }

Kotlin 枚举类可以实现默认的接口方法,枚举类常量成员也可以实现自己的接口方法。优先调用枚举类常量成员实现的方法,枚举类实现的方法次之。

	fun test() {
    
    
	    State.NORMAL
        State.ERROR
	}

打印数据如下:

实现接口 NORMAL
实现接口 enum

四、枚举常量的使用

每个枚举常量都有属性来获取它在枚举类声明中的名称和位置,包括 name(枚举常量名)ordinal(枚举常量位置)

    enum class State {
    
    
        NORMAL,
        ERROR
    }

	fun test() {
    
    
        val normal = State.NORMAL.name //常量名
        val normalIndex = State.NORMAL.ordinal //常量下标

        val error = State.ERROR.name
        val errorIndex = State.ERROR.ordinal
        
        println("枚举常量的使用:name == $normal | ordinal == $normalIndex ")
        println("枚举常量的使用:name == $error | ordinal == $errorIndex ")
	}

打印数据如下:

枚举常量的使用:name == NORMAL | ordinal == 0 
枚举常量的使用:name == ERROR | ordinal == 1 

Kotlin 中的枚举类有合成方法,允许列出定义的枚举常量,并通过名称获得枚举常量。这些方法的签名如下:

EnumClass.valueOf(value: String): EnumClass
EnumClass.values(): Array<EnumClass>

如果指定的名称与类中定义的任何枚举常量不匹配,valueOf() 方法将会抛出 IllegalArgumentException 异常;如果 values() 下标位置不匹配,则会抛出下标越界异常。

	fun test() {
    
    
        val normalName = State.valueOf("NORMAL") //指定名称常量
        val errorOrdinal = State.values()[1] //指定下标位置常量

        println("枚举常量的使用:name == $normalName")
        println("枚举常量的使用:name == $errorOrdinal")
	}

打印数据如下:

枚举常量的使用:name == NORMAL
枚举常量的使用:name == ERROR

从 Kotlin1.1 开始,就可以使用 enumValues<T>()enumValueOf<T>() 结合泛型的方式来访问枚举类中的常量:

	fun test() {
    
    
        val stateName = enumValues<State>().joinToString {
    
     it.name } //打印所有常量
        val stateError = enumValueOf<State>("ERROR") //单个常量

        println("枚举常量的使用:stateName == $stateName")
        println("枚举常量的使用:stateError == $stateError")
	}

打印数据如下:

枚举常量的使用:stateName == NORMAL, ERROR
枚举常量的使用:stateError == ERROR

enum常量还实现了 Comparable 接口,其自然顺序是它们在enum类中定义的顺序。

源码地址:https://github.com/FollowExcellence/KotlinDemo-master

点关注,不迷路


好了各位,以上就是这篇文章的全部内容了,能看到这里的人呀,都是人才

我是suming,感谢各位的支持和认可,您的点赞就是我创作的最大动力,我们下篇文章见!

如果本篇博客有任何错误,请批评指教,不胜感激 !

要想成为一个优秀的安卓开发者,这里有必须要掌握的知识架构,一步一步朝着自己的梦想前进!Keep Moving!

猜你喜欢

转载自blog.csdn.net/m0_37796683/article/details/108872675
今日推荐