Kotlin 枚举类 #

一、枚举类定义 #

1.1 基本语法 #

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

1.2 使用枚举 #

kotlin
val direction = Direction.NORTH

when (direction) {
    Direction.NORTH -> println("北")
    Direction.SOUTH -> println("南")
    Direction.EAST -> println("东")
    Direction.WEST -> println("西")
}

二、枚举属性 #

2.1 带属性的枚举 #

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

val red = Color.RED
println(red.rgb)  // 16711680

2.2 多属性枚举 #

kotlin
enum class Planet(
    val mass: Double,
    val radius: Double
) {
    EARTH(5.972e24, 6.371e6),
    MARS(6.39e23, 3.389e6),
    JUPITER(1.898e27, 6.9911e7);
    
    fun surfaceGravity(): Double {
        return 6.67e-11 * mass / (radius * radius)
    }
}

三、枚举方法 #

3.1 定义方法 #

kotlin
enum class Direction {
    NORTH, SOUTH, EAST, WEST;
    
    fun isVertical(): Boolean {
        return this == NORTH || this == SOUTH
    }
    
    fun opposite(): Direction {
        return when (this) {
            NORTH -> SOUTH
            SOUTH -> NORTH
            EAST -> WEST
            WEST -> EAST
        }
    }
}

Direction.NORTH.isVertical()  // true
Direction.NORTH.opposite()    // SOUTH

3.2 覆盖方法 #

kotlin
enum class Protocol {
    HTTP {
        override val port = 80
        override fun url(host: String) = "http://$host"
    },
    HTTPS {
        override val port = 443
        override fun url(host: String) = "https://$host"
    };
    
    abstract val port: Int
    abstract fun url(host: String): String
}

Protocol.HTTP.port       // 80
Protocol.HTTPS.url("example.com")  // https://example.com

四、枚举内置属性和方法 #

4.1 name 和 ordinal #

kotlin
enum class Color {
    RED, GREEN, BLUE
}

val color = Color.GREEN
color.name      // "GREEN"
color.ordinal   // 1

4.2 values 和 valueOf #

kotlin
// 获取所有枚举值
val colors = Color.values()
// [RED, GREEN, BLUE]

// 根据名称获取枚举
val red = Color.valueOf("RED")

// Kotlin 1.9+ 使用 entries
val allColors = Color.entries

4.3 遍历枚举 #

kotlin
Color.values().forEach { color ->
    println("${color.name}: ${color.ordinal}")
}

// 或
for (color in Color.values()) {
    println(color)
}

五、枚举与 when #

5.1 完整覆盖 #

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

fun getAngle(direction: Direction): Int = when (direction) {
    Direction.NORTH -> 0
    Direction.SOUTH -> 180
    Direction.EAST -> 90
    Direction.WEST -> 270
    // 不需要 else,编译器检查完整性
}

5.2 作为表达式 #

kotlin
val description = when (direction) {
    Direction.NORTH -> "向北"
    Direction.SOUTH -> "向南"
    Direction.EAST -> "向东"
    Direction.WEST -> "向西"
}

六、枚举实现接口 #

6.1 实现接口 #

kotlin
interface Printable {
    fun print(): String
}

enum class Color : Printable {
    RED {
        override fun print() = "红色"
    },
    GREEN {
        override fun print() = "绿色"
    },
    BLUE {
        override fun print() = "蓝色"
    }
}

Color.RED.print()  // "红色"

6.2 统一实现 #

kotlin
interface Describable {
    fun describe(): String
}

enum class Priority : Describable {
    LOW, MEDIUM, HIGH;
    
    override fun describe(): String {
        return "Priority: $name"
    }
}

七、实战示例 #

7.1 HTTP 状态码 #

kotlin
enum class HttpStatus(val code: Int, val message: String) {
    OK(200, "OK"),
    CREATED(201, "Created"),
    BAD_REQUEST(400, "Bad Request"),
    UNAUTHORIZED(401, "Unauthorized"),
    FORBIDDEN(403, "Forbidden"),
    NOT_FOUND(404, "Not Found"),
    INTERNAL_ERROR(500, "Internal Server Error");
    
    val isSuccess: Boolean
        get() = code in 200..299
    
    val isClientError: Boolean
        get() = code in 400..499
    
    val isServerError: Boolean
        get() = code in 500..599
}

HttpStatus.OK.isSuccess       // true
HttpStatus.NOT_FOUND.message  // "Not Found"

7.2 用户角色 #

kotlin
enum class Role(val permissions: List<String>) {
    ADMIN(listOf("read", "write", "delete", "manage")),
    MANAGER(listOf("read", "write", "manage")),
    USER(listOf("read", "write")),
    GUEST(listOf("read"));
    
    fun hasPermission(permission: String): Boolean {
        return permission in permissions
    }
}

Role.ADMIN.hasPermission("delete")  // true
Role.USER.hasPermission("manage")   // false

7.3 订单状态 #

kotlin
enum class OrderStatus {
    PENDING,
    CONFIRMED,
    PROCESSING,
    SHIPPED,
    DELIVERED,
    CANCELLED;
    
    fun canTransitionTo(newStatus: OrderStatus): Boolean {
        return when (this) {
            PENDING -> newStatus in listOf(CONFIRMED, CANCELLED)
            CONFIRMED -> newStatus in listOf(PROCESSING, CANCELLED)
            PROCESSING -> newStatus in listOf(SHIPPED, CANCELLED)
            SHIPPED -> newStatus == DELIVERED
            DELIVERED, CANCELLED -> false
        }
    }
}

OrderStatus.PENDING.canTransitionTo(OrderStatus.CONFIRMED)  // true
OrderStatus.SHIPPED.canTransitionTo(OrderStatus.CANCELLED)  // false

7.4 日志级别 #

kotlin
enum class LogLevel(val priority: Int) {
    VERBOSE(0),
    DEBUG(1),
    INFO(2),
    WARN(3),
    ERROR(4);
    
    fun shouldLog(minLevel: LogLevel): Boolean {
        return priority >= minLevel.priority
    }
}

LogLevel.ERROR.shouldLog(LogLevel.INFO)   // true
LogLevel.DEBUG.shouldLog(LogLevel.WARN)   // false

八、枚举类 vs 密封类 #

8.1 选择建议 #

kotlin
// 使用枚举:固定值,无复杂状态
enum class Direction { NORTH, SOUTH, EAST, WEST }

// 使用密封类:需要携带不同类型的数据
sealed class Result {
    data class Success(val data: String) : Result()
    data class Error(val code: Int, val message: String) : Result()
}

8.2 对比 #

特性 枚举类 密封类
实例 固定单例 可多个实例
数据 固定属性 可变数据
继承 不能继承 可以继承
序列化 自动支持 需要处理

九、最佳实践 #

9.1 使用有意义的名称 #

kotlin
// 推荐
enum class HttpStatus { OK, NOT_FOUND }
enum class UserRole { ADMIN, USER }

// 不推荐
enum class Status { A, B, C }

9.2 添加文档注释 #

kotlin
enum class Priority {
    /** 低优先级 */
    LOW,
    /** 中优先级 */
    MEDIUM,
    /** 高优先级 */
    HIGH
}

9.3 使用 when 表达式 #

kotlin
// 推荐:when 表达式
fun handle(status: Status) = when (status) {
    Status.PENDING -> "Pending"
    Status.ACTIVE -> "Active"
    Status.COMPLETED -> "Completed"
}

// 不推荐:if-else 链
fun handle(status: Status): String {
    if (status == Status.PENDING) return "Pending"
    // ...
}

十、总结 #

枚举类要点:

特性 说明
name 枚举名称
ordinal 序号(从0开始)
values() 获取所有枚举值
valueOf() 根据名称获取
属性 可以定义属性
方法 可以定义方法

下一步,让我们学习 对象与伴生对象

最后更新:2026-03-27