メインコンテンツまでスキップ

Enumクラス

enum class の最も基本的なユースケースは、タイプセーフな enum の実装です。

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

それぞれの enum 定数はオブジェクトです。enum 定数はカンマで区切られます。

それぞれの enum は enum class のインスタンスであるため、次のように初期化できます。

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

匿名クラス

enum 定数は、対応するメソッドを持つ独自の匿名クラス、および基底メソッドのオーバーライドとともに、それらを宣言できます。

enum class ProtocolState {
WAITING {
override fun signal() = TALKING
},

TALKING {
override fun signal() = WAITING
};

abstract fun signal(): ProtocolState
}

enum class がメンバを定義する場合は、定数の定義とメンバの定義をセミコロンで区切ります。

enum class での interface の実装

enum class は interface を実装できます(ただし、クラスから派生することはできません)。すべてのエントリに対して interface メンバの共通の実装を提供するか、匿名クラス内の各エントリに対して個別の実装を提供します。 これを行うには、実装する interface を次のように enum class の宣言に追加します。

import java.util.function.BinaryOperator
import java.util.function.IntBinaryOperator

enum class IntArithmetics : BinaryOperator<Int>, IntBinaryOperator {
PLUS {
override fun apply(t: Int, u: Int): Int = t + u
},
TIMES {
override fun apply(t: Int, u: Int): Int = t * u
};

override fun applyAsInt(t: Int, u: Int) = apply(t, u)
}

fun main() {
val a = 13
val b = 31
for (f in IntArithmetics.entries) {
println("$f($a, $b) = ${f.apply(a, b)}")
}
}

すべての enum class は、デフォルトで Comparable interface を実装します。enum class の定数は自然な順序で定義されています。詳細については、Ordering を参照してください。

enum 定数の操作

Kotlin の enum class には、定義された enum 定数をリストし、その名前で enum 定数を取得するための合成プロパティとメソッドがあります。 これらのメソッドのシグネチャは次のとおりです(enum class の名前が EnumClass であると仮定します)。

EnumClass.valueOf(value: String): EnumClass
EnumClass.entries: EnumEntries<EnumClass> // specialized List<EnumClass>

以下は、それらの動作例です。

enum class RGB { RED, GREEN, BLUE }

fun main() {
for (color in RGB.entries) println(color.toString()) // prints RED, GREEN, BLUE
println("The first color is: ${RGB.valueOf("RED")}") // prints "The first color is: RED"
}

指定された名前がクラスで定義されている enum 定数のいずれにも一致しない場合、valueOf() メソッドは IllegalArgumentException をスローします。

Kotlin 1.9.0 で entries が導入される前は、values() 関数を使用して enum 定数の配列を取得していました。

すべての enum 定数には、name および ordinal プロパティもあり、enum class の宣言でその名前と位置(0 から始まる)を取得するために使用されます。

enum class RGB { RED, GREEN, BLUE }

fun main() {

println(RGB.RED.name) // prints RED
println(RGB.RED.ordinal) // prints 0

}

enumValues<T>() および enumValueOf<T>() 関数を使用すると、enum class の定数に汎用的な方法でアクセスできます。 Kotlin 2.0.0 では、enumEntries<T>() 関数が enumValues<T>() 関数の代わりとして導入されました。 enumEntries<T>() 関数は、指定された enum 型 T のすべての enum エントリのリストを返します。

enumValues<T>() 関数は引き続きサポートされていますが、パフォーマンスへの影響が少ないため、enumEntries<T>() 関数を使用することをお勧めします。enumValues<T>() を呼び出すたびに新しい配列が作成されますが、enumEntries<T>() を呼び出すたびに同じリストが毎回返されるため、はるかに効率的です。

次に例を示します。

enum class RGB { RED, GREEN, BLUE }

inline fun <reified T : Enum<T>> printAllValues() {
println(enumEntries<T>().joinToString { it.name })
}

printAllValues<RGB>()
// RED, GREEN, BLUE

インライン関数と具象化された型パラメータの詳細については、インライン関数を参照してください。