列挙型クラス (Enum Classes)
列挙型クラスの最も基本的な使用法は、型安全な列挙型を実装するのに使うというものです:
enum class Direction {
NORTH, SOUTH, WEST, EAST
}
各列挙型の定数はオブジェクトです。列挙型定数はカンマで区切られます。
個々の列挙型定数が列挙型クラスのインスタンスな事から、以下のように初期化する事も出来ます:
enum class Color(val rgb: Int) {
RED(0xFF0000),
GREEN(0x00FF00),
BLUE(0x0000FF)
}
無名クラス
列挙型定数は、独自の無名クラスを宣言することができ、 それらにメソッド、基底クラスのメソッドのオーバーライドも同様に併せて宣言できます:
enum class ProtocolState {
WAITING {
override fun signal() = TALKING
},
TALKING {
override fun signal() = WAITING
};
abstract fun signal(): ProtocolState
}
列挙型クラスでメンバが定義されている場合は、 列挙型 定数定義とメンバ定義の間をセミコロンで区切る必要があります。
列挙型クラスでのインターフェースの実装
列挙型クラスはインターフェースを実装する事が出来ます(けれどクラスを継承する事は出来ません)。 その場合、全てのエントリに共通の実装を提供する事も出来ますし、 個々のエントリをその無名クラスで別々に提供する事も出来ます。 これは実装したいインターフェースを列挙型の宣言に以下のように追加する事で行なえます:
列挙型はすべてComparableインターフェースをデフォルトで実装しています。 列挙型で定義される列挙型定数は自然な順番(natual order)で定義されます。 より詳細な情報は並べ替えを参照ください。
列挙型定数を使用した作業
Kotlinの列挙型クラスは、定義された列挙型定数を羅列したり、その名前で列挙型定数を得ることを可能にするメソッドを自動で持っています。
(列挙型クラスの名前を EnumClass
と仮定して)これらのメソッドのシグネチャは次のとおりです。
EnumClass.valueOf(value: String): EnumClass
EnumClass.values(): Array<EnumClass>
以下はこれらのメソッドの使い方の例です:
指定された名前が、クラスで定義されている列挙型定数のいずれとも一致しない場合、valueOf()
メソッドは IllegalArgumentException
をスローします。
enumValues<T>()
関数とenumValueOf<T>()
関数を用いて、
列挙型クラスの定数にジェネリックなやり方でアクセスする事が出来ます。
enum class RGB { RED, GREEN, BLUE }
inline fun <reified T : Enum<T>> printAllValues() {
print(enumValues<T>().joinToString { it.name })
}
printAllValues<RGB>() // prints RED, GREEN, BLUE
インライン関数のreified型パラメータについてもっと知りたい方は、インライン関数を参照のこと
Kotlin 1.9.0では、values()
関数を置き換えるべくentries
プロパティが導入されました。
entries
プロパティは列挙型定数を事前に確保されたイミュータブルなリストとして返します。
これはコレクションを扱っている時にとりわけ便利で、
またパフォーマンスの問題を避けるのにも役立ちます。
例:
enum class RGB { RED, GREEN, BLUE }
fun main() {
for (color in RGB.entries) println(color.toString())
// prints RED, GREEN, BLUE
}
すべての列挙型定数は、
列挙型クラス宣言でその名前と位置を取得するためのプロパティ、
name
と ordinal
があります。
位置は0から始まる列挙型クラス内の位置を返します: