# 枚举类
大多数基本枚举的用法是实现类型安全的枚举
``` kotlin
enum class Direction {
NORTH, SOUTH, WEST, EAST
}
```
每个枚举常量都是一个对象。枚举常量用逗号分隔。
## 初始化
由于每个枚举都是枚举类的实例,它们可以被初始化
``` kotlin
enum class Color(val rgb: Int) {
RED(0xFF0000),
GREEN(0x00FF00),
BLUE(0x0000FF)
}
```
## 匿名类
枚举常量还能声明它们自己的匿名类
``` kotlin
enum class ProtocolState {
WAITING {
override fun signal() = TALKING
},
TALKING {
override fun signal() = WAITING
};
abstract fun signal(): ProtocolState
}
```
用它们一致的方法覆盖基类方法。注意如果这个枚举类定义了成员,你需要用一个分号分隔枚举常量定义和成员定义,与 Java 中一样。
## 与枚举常量一起工作
与 Java 一样,Kotlin 中的枚举类有合成方法允许列出已定义的枚举常量并通过它的名称得到一个枚举常量。这些方法的签名像下面这样(假定枚举类的名称为 `EnumClass`):
``` kotlin
EnumClass.valueOf(value: String): EnumClass
EnumClass.values(): Array<EnumClass>
```
如果指定的名称不能匹配到任何在类中定义的枚举常量,`valueOf()` 方法会抛出一个 `IllegalArgumentException`。
每个枚举常量都属性来获取它的名称并在枚举类声明中定位:
``` kotlin
val name: String
val ordinal: Int
```
枚举常量还实现了 [Comparable](/api/latest/jvm/stdlib/kotlin/-comparable/index.html) 接口,利用它们在枚举类中定义的顺序以正常地排序。