🆕

【Kotlin】Enum.entriesを活用しよう!効果的なコードの書き方

2023/04/11に公開

はじめに

Kotlin には 次のようなenum class があります。

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

https://kotlinlang.org/docs/enum-classes.html

本記事では Kotlin 1.8.20 で 追加された enum class の entries について解説します。

enum class の entries とは

従来 enum class にある values() メソッドを使用することで、enum class で定義されたオブジェクトを取得することができました。しかし、この values() には2つの問題がありました。

  1. 配列(Array<E>)を返すが、配列は変更可能であるため values() を呼び出すたびに配列の新しいインスタンスを作る必要があり Kotlin/Java の両方で隠れたパフォーマンス上の問題が発生する可能性がある。
  2. ほどんどの API では配列ではなく、Collection API(Listなど)を使用するためユーザーは配列を手動で変換する必要がある。

これらの問題を解決するために提案されたのが entries プロパティです。これは配列の代わりに割当て済みのイミュータブルなオブジェクトのリストを返してくれるものです。

https://github.com/Kotlin/KEEP/blob/master/proposals/enum-entries.md#examples-of-performance-issues

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>> となっており、ドキュメントはこちらから確認することができます。

https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.enums/-enum-entries.html

Reference

Discussion