• 从零开始学Kotlin-枚举(9)


    从零开始学Kotlin基础篇系列文章

    枚举的定义

    • 一个类的对象是有限且固定的,这种实例有限且固定的类称为枚举类;
    • 枚举常量用逗号分隔,每个枚举常量都是一个对象;
        enum class EnumDemo9 {
            RED, BLUE, BLACK, WHITE
        }
    

    枚举初始化

    • 每一个枚举都是枚举类的实例,它们可以被初始化;枚举类的主构造函数默认是私有的,初始化时需要在主构造函数中声明;
        enum class EnumDemo91(val rgb: Int) {
            RED(0xff0000),
            BLUE(0x0011ff),
            BLACK(0x000000),
            WHITE(0xffffff),
        }
    

    枚举的使用

    • EnumClass.valueOf(value: String): 由枚举值的名称获取枚举实例;未匹配成功,会抛出IllegalArgumentException
    • EnumClass.values(): 以数组的形式,获取所有的枚举实例
        fun main(args: Array<String>) {
            var colors: Array<EnumDemo91> = EnumDemo91.values()
            var redColor = EnumDemo91.valueOf("RED")
        }
    
    • 每个枚举常数值都拥有属性,获取枚举相关信息:
      • val name: String //获取枚举名称
      • val ordinal: Int //获取枚举值在所有枚举数组中定义的顺序
        fun main(args: Array<String>) {
            val redColor = EnumDemo91.valueOf("RED")
            var redColorName = redColor.name
            var redColorOrdinal = redColor.ordinal
        }
    
    • 自 Kotlin 1.1 起,可以使用 enumValues() 和 enumValueOf() 函数以泛型的方式访问枚举类中的常量
        print(enumValues<EnumDemo91>().joinToString { it.name })//输出:RED,BLUE,BLACK,WHITE
        print(enumValueOf<EnumDemo91>("RED"))//输出:RED
    

    枚举类与接口

    • 枚举类实现接口的情况与抽象方法类似,所有的枚举常量都应在其匿名类中实现接口的方法。
        //定义一个接口
        interface ItemClickListener {
             fun onClick(msg: String)
        }
        //枚举类继承接口
        enum class EnumDemo92 : ItemClickListener {
            BUTTON {
                override fun onClick(msg: String) {
                    print(msg)
                }
            },
            IMAGE {
                override fun onClick(msg: String) {
                    print(msg)
                }
            }
        }
    

    匿名类与抽象方法

    • 枚举还支持以声明自己的匿名类及相应的方法、以及覆盖基类的方法;
    • 在枚举类中声明了抽象方法,所有的枚举常量都应声明其匿名类,并在匿名类中实现枚举类中声明的抽象方法,如果不实现,编译器会报错;
    • 如果枚举类定义任何成员,要使用分号将成员定义中的枚举常量定义分隔开;
    • 匿名内部类中声明的方法,并不能在外部使用,即使是其枚举类型的实例,也不可调用;但重写的枚举类中声明的方法,可以被其实例调用;
        enum class Person(var code: Int) {
            NAME1(0) {
                override fun showName(name: String): Person {
                    return Person.values()[0]
                }
            },
            NAME2(1) {
                override fun showName(name: String): Person = NAME2
            };
    
            abstract fun showName(name: String): Person
        }
    
  • 相关阅读:
    赫夫曼树相关算法
    用栈来实现 括号匹配 字符序列检验
    二叉树的建立和遍历
    数据结构-算术表达式求值
    构造一个单链表L,其头结点指针为head,编写程序实现将L逆置
    单链表的基本操作(C语言)数据结构
    java代码打印杨辉三角
    无标题
    写一个方法,判断给定的数字是偶数还是奇数
    关于生物信息学与R的相关资料和网站
  • 原文地址:https://www.cnblogs.com/shen-hua/p/8383458.html
Copyright © 2020-2023  润新知