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