🆕
【Kotlin】Enum.entriesを活用しよう!効果的なコードの書き方
はじめに
Kotlin には 次のようなenum class
があります。
enum class Direction {
NORTH, SOUTH, WEST, EAST
}
本記事では Kotlin 1.8.20 で 追加された enum class の entries について解説します。
enum class の entries とは
従来 enum class にある values()
メソッドを使用することで、enum class で定義されたオブジェクトを取得することができました。しかし、この values()
には2つの問題がありました。
- 配列(
Array<E>
)を返すが、配列は変更可能であるためvalues()
を呼び出すたびに配列の新しいインスタンスを作る必要があり Kotlin/Java の両方で隠れたパフォーマンス上の問題が発生する可能性がある。 - ほどんどの API では配列ではなく、Collection API(Listなど)を使用するためユーザーは配列を手動で変換する必要がある。
これらの問題を解決するために提案されたのが entries
プロパティです。これは配列の代わりに割当て済みのイミュータブルなオブジェクトのリストを返してくれるものです。
enum class の entries の使い方
enum class の entries
プロパティは次のように使用することができます。Kotlin 1.8.20 時点では Experimental 機能となるため、ExperimentalStdlibApi
にオプトインする必要があります
@OptIn(ExperimentalStdlibApi::class)
fun findByRgb(rgb: String): Color?
= Color.entries.find { it.rgb == rgb }
enum class Color(val colorName: String, val rgb: String) {
RED("Red", "#FF0000"),
ORANGE("Orange", "#FF7F00"),
YELLOW("Yellow", "#FFFF00");
}
ちなみに entries
の型は List<E>
を実装した EnumEntries<E : Enum<E>>
となっており、ドキュメントはこちらから確認することができます。
Reference
- https://kotlinlang.org/docs/enum-classes.html
- https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.enums/-enum-entries.html
- https://www.youtube.com/watch?v=R1JpkpPzyBU&ab_channel=KotlinbyJetBrains
- https://github.com/Kotlin/KEEP/blob/master/proposals/enum-entries.md#examples-of-performance-issues
- https://kotlinlang.org/spec/declarations.html#enum-class-declaration
Discussion