0Pricing
Kotlin Academy · レッスン

whenとEnum

すべてのケースを処理します

「whenとEnum」はCoddyKit上の無料Kotlin Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはKotlin Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Kotlin Academyコースには全4レッスンが含まれています。

enumとwhenの組み合わせ

when式は、enumに基づいて分岐する自然な方法です。各定数に独自の分岐を用意します。

enum class Light { RED, YELLOW, GREEN }

fun action(l: Light) = when (l) {
    Light.RED -> "Stop"
    Light.YELLOW -> "Slow"
    Light.GREEN -> "Go"
}

fun main() {
    println(action(Light.GREEN))
}

網羅性

enumに対してwhenを式として使用し、すべての定数を網羅する場合、else分岐は必要ありません。コンパイラが網羅性を検証します。

enum class Coin { HEADS, TAILS }

fun flip(c: Coin) = when (c) {
    Coin.HEADS -> "Win"
    Coin.TAILS -> "Lose"
}

fun main() {
    println(flip(Coin.HEADS))
}

コンパイラが支えてくれる

後から新しい定数を追加したにもかかわらず分岐を追加し忘れると、コンパイラがエラーを報告します。そのため、enumとwhenは安全に拡張できます。

enum class Size { S, M, L }

fun label(s: Size) = when (s) {
    Size.S -> "Small"
    Size.M -> "Medium"
    Size.L -> "Large"
}

fun main() {
    println(label(Size.M))
}

定数のインポート

enumのメンバーをインポートすると、when内で型の接頭辞を省略でき、分岐を短くできます。

enum class Dir { UP, DOWN }

import Dir.UP
import Dir.DOWN

fun move(d: Dir) = when (d) {
    UP -> "y + 1"
    DOWN -> "y - 1"
}

fun main() {
    println(move(Dir.UP))
}

分岐のグループ化

複数の定数をカンマで列挙すると、1つの分岐を共有できます。

enum class Day { MON, TUE, WED, SAT, SUN }

fun kind(d: Day) = when (d) {
    Day.SAT, Day.SUN -> "Weekend"
    else -> "Weekday"
}

fun main() {
    println(kind(Day.SAT))
}

異なる型の値を返す

各分岐は値を生成でき、when全体がその値になります。

enum class Tier { FREE, PRO }

fun limit(t: Tier): Int = when (t) {
    Tier.FREE -> 10
    Tier.PRO -> 1000
}

fun main() {
    println(limit(Tier.PRO))
}

引数なしのwhen

条件に基づいて分岐することもできますが、enumの場合は対象を指定する形式が最も簡潔で、網羅性チェックも有効になります。

enum class Mood { HAPPY, SAD }

fun emoji(m: Mood) = when (m) {
    Mood.HAPPY -> ":)"
    Mood.SAD -> ":("
}

fun main() {
    println(emoji(Mood.HAPPY))
}

分岐での副作用

分岐では、値を返すだけでなく文を実行することもできます。

enum class Cmd { START, STOP }

fun run(c: Cmd) {
    when (c) {
        Cmd.START -> println("Starting...")
        Cmd.STOP -> println("Stopping...")
    }
}

fun main() {
    run(Cmd.START)
}

可能ならelseを避ける

elseを使うと網羅性チェックの効果が失われます。新しい定数を追加しても、気付かないうちにelseに入ってしまうためです。enumでは、明示的な分岐を優先してください。

enum class State { ON, OFF }

fun text(s: State) = when (s) {
    State.ON -> "on"
    State.OFF -> "off"
}

fun main() {
    println(text(State.OFF))
}

実践的なルーター

ユーザーのロールを権限に振り分ける処理は、網羅的なwhenの適した使い方です。

enum class Role { ADMIN, USER, GUEST }

fun canDelete(r: Role) = when (r) {
    Role.ADMIN -> true
    Role.USER -> false
    Role.GUEST -> false
}

fun main() {
    println(canDelete(Role.ADMIN))
}

プロパティとの組み合わせ

enumに基づいて分岐し、各分岐内でそのプロパティを使用することもできます。

enum class Coin(val cents: Int) { PENNY(1), DIME(10) }

fun describe(c: Coin) = when (c) {
    Coin.PENNY -> "Worth ${c.cents}"
    Coin.DIME -> "Worth ${c.cents}"
}

fun main() {
    println(describe(Coin.DIME))
}

理解度チェック

enumとwhenについて理解できているか確認しましょう。

まとめ

enumとwhenを組み合わせる方法を学びました。

  • enumに対するwhenは、elseなしで網羅的にできます。
  • コンパイラがすべての定数を網羅していることを強制します。
  • 定数はカンマでグループ化でき、各分岐は値を生成します。
  • 網羅性による安全性を保つため、elseは避けてください。
enum class Light { RED, GREEN }

fun go(l: Light) = when (l) {
    Light.RED -> false
    Light.GREEN -> true
}

fun main() {
    println(go(Light.GREEN))
}

よくある質問

「whenとEnum」レッスンは無料ですか?

はい。「whenとEnum」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Kotlin Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Kotlin Academyコースには全4レッスンが含まれています。

「whenとEnum」で何を学びますか?

すべてのケースを処理します ブラウザで直接実行するハンズオンコードでKotlin Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Kotlin Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのKotlin Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。

「whenとEnum」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このKotlin Academyレッスンでコードを書いて実行できますか?

はい。すべてのKotlin Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. Enumの定義
  2. Enumのプロパティとメソッド
  3. whenとEnum
  4. Enumの値と序数
← Kotlin Academyに戻る