1. 程式人生 > >從零開始學Kotlin-枚舉(9)

從零開始學Kotlin-枚舉(9)

emc roi 實例 list cnblogs 外部 listener ring 枚舉

從零開始學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

    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
    }

從零開始學Kotlin-枚舉(9)