iT邦幫忙

2022 iThome 鐵人賽

DAY 7
0
Mobile Development

【Kotlin Notes And JetPack】Build an App系列 第 7

Day 7.【Classes and Objects】Enum Classes

  • 分享至 

  • xImage
  •  

今天的主題是前天有提到的 Enum class ,我們來看看 Enum 可以做到哪些事吧!以下如有解釋不清或是描述錯誤的地方還請大家多多指教:

什麼?

之前有提到說 sealed class 和 enum class 都是可以來表示一個物件的不同狀態,只是差異是持有的 instances 是單一的還是可以多個。emun 通常都是以預先定義好的值呈現,稱作 type-safe enums:

// 逗號分開,文字都是以大寫表示
enum class Direction {
    NORTH, SOUTH, WEST, EAST
}

| Initialized Enum

除了基本的狀態外,enum class 還可以自定義 properties 和方法,也可以實作多個介面:

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

這樣每個常數會與設定的變數有對應的關聯:

| Default Properties

enum 在 compile 後會產生可以取得 value 的 properties。

  • ordinal
    可以取得現在的屬性在這些狀態中的 index,依樣從 0 開始算,當實作 Comparable 介面,這些屬性為依照排序邏輯
  • name
    取得屬性的命名,如上例的 Color 會拿到 RED, GREEN, BLUE
Color.values().forEach { 
    println("${it.ordinal}:${it.name} / ${it.rgb}")
}
// 0:RED / 16711680
// 1:GREEN / 65280
// 2:BLUE / 255

| Custom Method

如果想客製一些方法或是參數,先在最後一個常數加 ; 表示列舉的參數結束,下面就可以客製自己的方法。

  • custom method
enum class Color(val rgb: Int) {
    RED(0xFF0000),
    GREEN(0x00FF00),
    BLUE(0x0000FF);

	fun relation (): String {
		return "[$rgb]"
	}
}

println(Color.BLUE.relation()) // [255]
  • anonymous classes
enum class Game {
    PAPER {
		override fun winTo() = STONE
	},
    SCISSORS {
		override fun winTo() = PAPER
	},
    STONE {
		override fun winTo() = SCISSORS
	};

	abstract fun winTo(): Game
}

print("${Game.PAPER.winTo()}") // STONE
  • interfaces
interface Play {
	fun winTo() : Game
}
enum class Game : Play {
    PAPER {
		override fun winTo() = STONE
	},
    SCISSORS {
		override fun winTo() = PAPER
	},
    STONE {
		override fun winTo() = SCISSORS
	};
}

print("${Game.PAPER.winTo()}") // STONE

如何?

透過 Enum 來選擇要顯示的圖示,以主頁為例:

sealed class HomeVo
...
data class CityDayTemp(
    val day: String,
    val maxTemp: String,
    val minTemp: String,
	val icon: IconType
)

data class CityHourTemp(
    val cityId: Int,
    val time: String,
    val temp: String,
	val iconType: IconType
) : HomeVo(cityId)
...

// 天氣圖示
enum class IconType {
	RAIN, SUN, CLOUD
}

Reference

Official Kotlin
A complete guide to enum classes in Kotlin


上一篇
Day 6.【Classes and Objects】Data Classes
下一篇
Day 8.【Classes and Objects】Extensions
系列文
【Kotlin Notes And JetPack】Build an App30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言