Kotlin 枚举类的基本定义
枚举类是一种特殊的数据类型,用于定义一组固定的常量。Kotlin 中使用 enum class 关键字定义枚举类:
enum class Direction {
NORTH, SOUTH, EAST, WEST
}
每个枚举常量都是枚举类的实例,可以直接通过类名访问:
val direction = Direction.NORTH
println(direction) // 输出: NORTH
枚举类的属性和方法
枚举类可以像普通类一样定义属性和方法。每个枚举常量可以初始化自己的属性值:
enum class Color(val rgb: Int) {
RED(0xFF0000),
GREEN(0x00FF00),
BLUE(0x0000FF)
}
fun main() {
println(Color.RED.rgb) // 输出: 16711680
}
枚举类还可以定义方法,包括抽象方法:
enum class Operation {
ADD {
override fun apply(x: Int, y: Int) = x + y
},
SUBTRACT {
override fun apply(x: Int, y: Int) = x – y
};
abstract fun apply(x: Int, y: Int): Int
}
fun main() {
println(Operation.ADD.apply(5, 3)) // 输出: 8
println(Operation.SUBTRACT.apply(5, 3)) // 输出: 2
}
枚举类的实用功能
Kotlin 枚举类提供了一些实用功能,如获取所有枚举常量和通过名称查找枚举常量:
enum class Season {
SPRING, SUMMER, AUTUMN, WINTER
}
fun main() {
// 获取所有枚举常量
val seasons = Season.values()
seasons.forEach { println(it) }
// 通过名称查找枚举常量
val summer = Season.valueOf("SUMMER")
println(summer) // 输出: SUMMER
}
枚举类与 when 表达式
枚举类与 when 表达式结合使用时非常强大,可以确保所有枚举常量都被处理:
enum class Day {
MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY
}
fun isWeekend(day: Day) = when(day) {
Day.SATURDAY, Day.SUNDAY -> true
else -> false
}
fun main() {
println(isWeekend(Day.MONDAY)) // 输出: false
println(isWeekend(Day.SUNDAY)) // 输出: true
}
枚举类实现接口
枚举类可以实现接口,每个枚举常量可以提供不同的实现:
interface Printable {
fun print()
}
enum class Shape : Printable {
CIRCLE {
override fun print() {
println("圆形")
}
},
SQUARE {
override fun print() {
println("正方形")
}
}
}
fun main() {
Shape.CIRCLE.print() // 输出: 圆形
Shape.SQUARE.print() // 输出: 正方形
}
枚举类的序列化和反序列化
在实际应用中,经常需要将枚举类与字符串相互转换:
enum class Status {
PENDING, APPROVED, REJECTED
}
fun main() {
// 枚举转字符串
val status = Status.APPROVED
val statusStr = status.name
println(statusStr) // 输出: APPROVED
// 字符串转枚举
val parsedStatus = Status.valueOf("PENDING")
println(parsedStatus) // 输出: PENDING
}
枚举类的进阶用法
枚举类可以结合密封类实现更复杂的功能:
sealed class Command {
object Start : Command()
object Stop : Command()
data class Execute(val param: String) : Command()
}
fun process(command: Command) = when(command) {
is Command.Start -> println("开始执行")
is Command.Stop -> println("停止执行")
is Command.Execute -> println("执行参数: ${command.param}")
}
fun main() {
process(Command.Start) // 输出: 开始执行
process(Command.Execute("test")) // 输出: 执行参数: test
}
枚举类的性能考虑
枚举类相比常量类会占用更多内存,但在大多数情况下性能差异可以忽略。如果需要极致的性能,可以考虑使用常量类:
object Colors {
const val RED = 0xFF0000
const val GREEN = 0x00FF00
const val BLUE = 0x0000FF
}
fun main() {
println(Colors.RED) // 输出: 16711680
}
以上内容展示了 Kotlin 枚举类的主要特性和用法,从基础定义到高级用法,涵盖了实际开发中的常见场景。


