1. 程式人生 > >Kotlin 全面學習之路 (十二) --列舉類

Kotlin 全面學習之路 (十二) --列舉類

在對 密封類 的學習過程中我們知道兩者之間有所相同,那就具體學習一下 Kotlin 中的列舉類。

1. 基本實現

enum class Direction {
	NORTH, SOUTH, WEST, EAST
}

每一個列舉常量都是一個物件,列舉常量間使用逗號分隔。

2. 列舉初始化

enum class OzWitch(val des: String) {
    WEST("west"),
    NORTH("north"),
    EAST("east"),
    SOUTH("south");
}

列舉類的每一個列舉常量都是列舉類的例項,所以可以如上所示通過 建構函式 進行初始化。

3. 向列舉類中新增方法

除了不能繼承一個 enum 外,我們基本可以把 enum 看作一個常規的類,我們可以向 enum 新增方法。

enum class OzWitch(var des: String) {
    WEST("west"),
    NORTH("north"),
    EAST("east"),
    SOUTH("south");

    fun allData(): String? {
        for (it in values())
            des += it
        return des
    }
}

具體呼叫:

object Main {
    @JvmStatic
    fun main(args: Array<String>) {
        for(it in OzWitch.values()){
            println(it)
            println(it.allData())
        }
    }
}

正常列印日誌如下:

WEST
westWESTNORTHEASTSOUTH
NORTH
northWESTNORTHEASTSOUTH
EAST
eastWESTNORTHEASTSOUTH
SOUTH
southWESTNORTHEASTSOUTH

從列印結果來看,每一個列舉常量例項都會呼叫相同的方法、行為(其具體邏輯也是相同的)。

如何載入自己的邏輯?有兩種方法:

  1. 匿名類
  2. 介面實現

4. 匿名類

列舉類常量可以宣告自己的匿名類:

  • OzWitch
enum class OzWitch(var des: String) {
    WEST("west") {
        override fun showDes() {
            println("i am ${des}")
        }
    },
    NORTH("north") {
        override fun showDes() {
            println("i am ${des}")
        }
    },
    EAST("east") {
        override fun showDes() {
            println("i am ${des}")
        }
    },
    SOUTH("south") {
        override fun showDes() {
            println("i am ${des}")
        }
    };

    abstract fun showDes()
}

  • Main
object Main {
    @JvmStatic
    fun main(args: Array<String>) {
        for(it in Location.values()){
            println(it)
            it.setStr()
        }
    }
}
  • 列印日誌
NORTH
i am north
SOUTH
i am south
EAST
i am east
WEST
i am west

列舉類的每個例項物件都執行了自己相應的方法邏輯。

5.列舉實現介面

  • Info
interface Info {
    fun showInfo():String
}
  • OzWitch
enum class OzWitch(var des: String):Info {
    WEST("west") {
        override fun showInfo(): String {
            return "i am ${des}"
        }
    },
    EAST("east") {
        override fun showInfo(): String {
            return "i am ${des}"
        }
    },
    SOUTH("south") {
        override fun showInfo(): String {
            return "i am ${des}"
        }
    },
    NORTH("north") {
        override fun showInfo(): String {
            return "i am ${des}"
        }
    };
}
  • Main
object Main {
    @JvmStatic
    fun main(args: Array<String>) {

        for(it in OzWitch.values()){
            println(it)
            println(it.showInfo())
        }
    }
}

  • 日誌列印
WEST
i am west
EAST
i am east
SOUTH
i am south
NORTH
i am north

列舉類的每個例項物件都執行了自己相應的方法邏輯。