Kotlinでenumの使い方がよくわからない
そもそもenumってなんだろうか・・・
Kotlinでenumを使おうと思ってもなんだかよく使い方がわからなかったり、そもそもenumについてよくわかっていなかったりする人はいませんか?
こんにちは!エンジニアのかいです。Kotlinをこれから始めようとしている人、もしくは始めたての人であればプログラミングの基本であるenumについて悩んでいる人もいますよね。
そこで本日はKotlin初心者の方を対象にenumの様々な使い方からそもそもenumとはなんだろうか、という点についてわかりやすく解説していきます。
この記事はこんな人のために書きました。
- Kotlinでenumを使いこなしたい
- メソッドを定義してみたりしたい
- enumとは、という基礎から学びたい
Kotlin enumとは
それでは、いきなりenumの書き方を説明して行く前にまずは、enumとはそもそもどんなものなのだろうかという点について解説していきます。
enumとは別名列挙型などとも呼ばれ、定数を列挙する場合などに使われます。中で定義されたものは列挙子などと呼ばれますね。
enumを使うメリットもここで紹介したいところですが、基本的な使い方を学んだ上での方がメリットが理解しやすいと思うので使い方を説明後最終章で解説していきます。
enumの使い方
それでは実際の使い方をみていきましょう。
enum class myEnum{ TOKYO, KANAGAWA, CHIBA } fun main() { println(myEnum.CHIBA) }
CHIBA
このように、enum classで指定してやると、列挙型クラスとして認識されます。.列挙子としてやることでその値が取り出せていますね。
enumをfor文で回す
次はfor文を使ってみましょう。
enum class myEnum{ TOKYO, KANAGAWA, CHIBA } fun main() { for(pre in myEnum.values()){ println(pre) } }
TOKYO KANAGAWA CHIBA
ここでのミソは.values()というメソッドを利用することで、クラスのvalueが取得できます。この時点では返り値はArray<EnumClass>なのでfor文で回せば全ての値が取得できますね。
メソッドを定義してみよう
さて、次はenumクラス内でメソッドを定義してみましょう。
enum class myEnum{ TOKYO{ override fun prefecure(): String { return "I'm from Tokyo!" } }, KANAGAWA{ override fun prefecure(): String { return "I'm from Kanavawa!" } }, CHIBA{ override fun prefecure(): String { return "I'm from Chiba!" } }; abstract fun prefecure(): String } fun main() { for(pre in myEnum.values()){ println(pre.prefecure()) } }
I'm from Tokyo! I'm from Kanavawa! I'm from Chiba!
このように、抽象メソッドをオーバーライドしてあげることで、定数値ごとに振る舞いを変えることができます。ちなみによりKotlin的には以下のように書きます。
enum class myEnum{ TOKYO{ override fun prefecure(): String = "I'm from Tokyo!" }, KANAGAWA{ override fun prefecure(): String = "I'm from Kanavawa!" }, CHIBA{ override fun prefecure(): String = "I'm from Chiba!" }; abstract fun prefecure(): String } fun main() { for(pre in myEnum.values()){ println(pre.prefecure()) } }
I'm from Tokyo! I'm from Kanavawa! I'm from Chiba!
だいぶスッキリしましたね。
引数をもたせてみよう
KotlinのEnumの定数値にはパラメータを持たすことができます。各定数値にIDというパラメータを付与してみます。
enum class myEnum(val id: Int){ TOKYO(1), KANAGAWA(2), CHIBA(3) } fun main() { println(myEnum.TOKYO.id) for (pre in myEnum.values()){ println("${pre.name} ${pre.id}") } }
1 TOKYO 1 KANAGAWA 2 CHIBA 3
このように引数にもたせることによって付随するパラメータを与えることができます。以下のように複数設定することも可能です。
enum class myEnum(val id: Int, val jp: String){ TOKYO(1, "東京"), KANAGAWA(2, "神奈川"), CHIBA(3, "千葉") } fun main() { for (pre in myEnum.values()){ println("${pre.name} ${pre.id} ${pre.jp}") } }
TOKYO 1 東京 KANAGAWA 2 神奈川 CHIBA 3 千葉
enumを使うメリット
さて、ここまで一通りenumの使い方をみてきましたが、実際にenumを使うと何が良いのかということについても補足しておきます。
まず第一のメリットは安全性が高まるということですね。つまり、あらかじめ決まった定数をまとめてセットしておくことでそれ以外が指定されることを防ぎプログラムが予想外の動作をすることを防げます。
あとは、利用する時にどんな引数が取れるか明確にわかるので可読性が高く、利用しやすいですね。また、ただ定数をまとめるだけでなく様々なパラメータを持たせることができたり、メソッドが定義できたりもするので拡張の幅も広いです。
まとめ
一般に開発をしているとenumを実際に利用している例をみることは少ないかもしれませんが、適切に使えると実はとても便利なenumですのでこれを機にマスターして実際に使ってみてください!
それでは!!