Lớp liệt kê — Enum classes

Liem Vo
Viet Android Developers
3 min readOct 24, 2021

Những trường hợp căn bản dùng lớp liệt kê là để hiện thực kiểu dữ liệu an toàn liệt kê.

https://youtu.be/Tn6P1NXgD60

enum class Ocean {
ARCTIC, ATLANTIC, INDIAN, PACIFIC, SOUTHERN
}

Mỗi hằng số liệt kê là một object . Các hằng số liệt kê là cách nhau bởi dấu phẩy. Khi đó mỗi hằng số liệt kê là một ví dụ của lớp liệt kê. Nó cũng có thể khởi tạo như sau.

enum class Level(val mark: Float) {
VERY_GOOD(8.0f),
GOOD(7.0f),
AVERAGE(5.0f),
FAIL(3.5f)
}

Lớp vô danh — Anonymous classes

Các hằng số liệt kê có thể được khai báo lớp nó sở hữu và có những hàm của, và nó cũng có thể hiện thực lại các hàm nền.

enum class ToggleState {
ON {
override fun toggle(): ToggleState {
return OFF
}
},
OFF {
override fun toggle(): ToggleState {
return ON
}
};
abstract fun toggle(): ToggleState
}

Nếu lớp liệt kê có các hàm hoặc thuộc tính thì dùng dấu chấm phẩy để ngăn cách giữ hằng liệt kê.

Hiện thực interfaces trong lớp liệt kê

Một lớp liệt kê có thể hiện thực một interface (nhưng nó không thể kế thừa một lớp), có thể hiện thực các hàm và cung cấp cho các lớp vô danh hoặc tách biệt sự hiện thực ở lớp vô danh. Như ví dụ dưới đây:

enum class IntArithmetics : BinaryOperator<Int>, IntBinaryOperator {
PLUS {
override fun apply(t: Int, u: Int): Int = t + u
},
TIMES {
override fun apply(t: Int, u: Int): Int = t * u
};

override fun applyAsInt(t: Int, u: Int) = apply(t, u)
}

Thao tác với các hằng số liệt kê

Lớp liệt kê Kotlin có các phương thức tổng hợp để định nghĩa hằng số liệt kê và lấy hằng số liệt kê theo tên. Các hàm đó như sau:

EnumClass.valueOf(value: String): EnumClass 
EnumClass.values(): Array<EnumClass>

valueOf() sẽ trả về lỗi IllegalArgumentException nếu tên đưa vào không trùng với hằng số liệt kê trong lớp liệt kê.

Chúng ta có thể truy các hằng số của lớp liệt kê theo hàm trừu tượng enumvalues<T>()enumValueOf<T>()

inline fun <reified T : Enum<T>> printAllValues() {     print(enumValues<T>().joinToString { it.name }) }

Hằng số liệt kê có thuộc tính tên và vị trí của nó trong khai báo lớp liệt kê.

val name: String 
val ordinal: Int

Hằng số liệt kê mặc định là hiện thực Comparable interface và thứ tự tự nhiên là thứ tự mà chúng được định nghĩa trong lớp liệt kê.

Cảm ơn các bạn đã đọc bài. Đăng ký kênh chúng tôi để xem những bài học mới nhất.

Youtube kênh: https://bit.ly/2EFOOXs

Thảo luận bằng cách comment ở đây hoặc trong video của blog này.

--

--