kotlin枚舉類enum class


1.概念

​ 與Java一樣,枚舉類是一種特殊的類,kotlin可以通過enum class關鍵字定義枚舉類。

2.注意點

  • 枚舉類可以實現0~N個接口;
  • 枚舉類默認繼承於kotlin.Enum類(其他類最終父類都是Any),因此kotlin枚舉類不能繼承類
  • 非抽象枚舉類不能用open修飾符修飾,因此非抽象枚舉類不能派生子類;
  • 抽象枚舉類不能使用abstract關鍵字修飾enum class,抽象方法和抽象屬性需要使用;
  • 枚舉類構造器只能使用private修飾符修飾,若不指定,則默認為private;
  • 枚舉類所有實例在第一行顯式列出,每個實例之間用逗號隔開,整個聲明以分號結尾;
  • 枚舉類是特殊的類,也可以定義屬性、方法、構造器;
  • 枚舉類應該設置成不可變類,即屬性值不允許改變,這樣更安全;
  • 枚舉屬性設置成只讀屬性后,最好在構造器中為枚舉類指定初始值,如果在聲明時為枚舉指定初始值,會導致所有枚舉值(或者說枚舉對象)的該屬性都一樣。

3.定義枚舉類

/**
 * 定義一個枚舉類
 * 定義枚舉類接口,接口給只讀屬性復制
 */
enum class EnumClass(val enumParam: String) {
    MON("星期一"), TUES("星期二"), WED("星期三");//逗號隔開,分號結尾

    /**
     * 枚舉類方法
     */
    fun enumFun() {
        println("枚舉值:$this 枚舉屬性:$enumParam")
    }
}

fun main(args: Array<String>) {
    println(EnumClass.MON)//獲取枚舉值,此處相當於調用枚舉值的toString   結果:MON
    println(EnumClass.MON.name)//獲取枚舉值的名字,相當於枚舉值調用toString  結果:MON
    println(EnumClass.MON.enumParam)//獲取枚舉屬性    結果:星期一
    EnumClass.MON.enumFun()//調用枚舉方法     結果:枚舉值:MON 枚舉屬性:星期一
    println(EnumClass.valueOf("MON"))//通過枚舉字符串名獲取枚舉值,EnumClass.valueOf("MON")<=>EnumClass.MON   結果:MON
    println(EnumClass.valueOf("MON").enumParam)//獲取該枚舉值的屬性  結果:星期一
    EnumClass.valueOf("MON").enumFun()//調用該枚舉值的方法   結果:枚舉值:MON 枚舉屬性:星期一
    println(EnumClass.values().joinToString { it.name })//獲取該枚舉值所有枚舉值組成的數組並打印出枚舉名   結果:MON, TUES, WED
    println(EnumClass.MON.ordinal)//獲取枚舉值在枚舉類中定義位置  結果:0
    println(enumValueOf<EnumClass>("MON"))//通過枚舉值名字獲取枚舉值<=>EnumClass.valueOf("MON")<=>EnumClass.MON     結果:MON
    println(enumValues<EnumClass>().joinToString { it.name })//獲取指定枚舉所有枚舉值<=>EnumClass.values() 結果:MON, TUES, WED
}

4.枚舉類實現接口

(1)方式一:枚舉值分別實現接口的抽象成員

/**
 * 定義一個枚舉類
 * 定義枚舉類接口,接口給只讀屬性復制
 */
enum class EnumClass(val enumParam: String) : EnumInterface {
    MON("星期一") {
        override fun interfaceFun() {
            println(enumParam)
        }

        override val interfaceParam: String
            get() = "1"
    },
    TUES("星期二") {
        override fun interfaceFun() {
            println(enumParam)
        }

        override val interfaceParam: String
            get() = "2"
    },
    WED("星期三") {
        override fun interfaceFun() {
            println(enumParam)
        }

        override val interfaceParam: String
            get() = "3"
    };//逗號隔開,分號結尾
}

fun main(args: Array<String>) {
    EnumClass.MON.interfaceFun()//調用枚舉對象實現的抽象方法 結果:星期一
    println(EnumClass.MON.interfaceParam)//調用枚舉對象實現的抽象屬性    結果:1
}

interface EnumInterface {
    fun interfaceFun()
    val interfaceParam : String
}

(2)方式二:枚舉類統一實現接口的抽象成員

/**
 * 定義一個枚舉類
 * 定義枚舉類接口,接口給只讀屬性復制
 */
enum class EnumClass(val enumParam: String) : EnumInterface {
    MON("星期一"),
    TUES("星期二"),
    WED("星期三");//逗號隔開,分號結尾

    override fun interfaceFun() {
        println("統一實現的接口的抽象方法")
    }

    override val interfaceParam: String
        get() = "統一實現的抽象屬性"
}

fun main(args: Array<String>) {
    EnumClass.MON.interfaceFun()//調用枚舉對象實現的抽象方法 結果:統一實現的接口的抽象方法
    println(EnumClass.MON.interfaceParam)//調用枚舉對象實現的抽象屬性    結果:統一實現的抽象屬性
}

interface EnumInterface {
    fun interfaceFun()
    val interfaceParam: String
}

5.抽象枚舉類

只能通過枚舉值分別實現抽象枚舉類抽象成員

/**
 * 抽象枚舉類
 */
enum class AbstractEnumClass {
    MON {
        override val abstractParam: String
            get() = "星期一"

        override fun abstractFun() {
            println(abstractParam)
        }
    },
    TUES {
        override val abstractParam: String
            get() = "星期二"

        override fun abstractFun() {
            println(abstractParam)
        }
    },
    WED {
        override val abstractParam: String
            get() = "星期三"

        override fun abstractFun() {
            println(abstractParam)
        }
    };

    abstract val abstractParam: String
    abstract fun abstractFun()
}

fun main(args: Array<String>) {
    AbstractEnumClass.MON.abstractFun()//調用枚舉對象實現的抽象方法 結果:星期一
    println(AbstractEnumClass.MON.abstractParam)//調用枚舉對象實現的抽象屬性    結果:星期一
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM