14
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Hey you, Kotlinでenumをwhenする時にelse使うなyo!

Last updated at Posted at 2022-12-27

ラッパーというよりむしろルー大柴みたいなタイトルになってしまいましたが、enum便利ですよね。
今日はKotlinのwhen句の引数にenumを入れる時の心がけについてです。

といっても、言いたいことは超シンプル。
elseを使うな」
これだけです。

サンプルで説明します。

enum class Hoge {
    FOO,
    BAR,
    BAZ,
}

fun extractMessage(hoge: Hoge): String {
    return when(hoge) {
        Hoge.FOO -> "FOO!"
        Hoge.BAR -> "BAR!!"
        else -> "Something else"
    }
}

割とやりがちですよね。
もちろん、普通に動きます。
ですが、ここで else を使ってしまうと、せっかくのenumのメリットが半減してしまいます。

どういう時に困るのか。
それはenumの種類が増えた時です。

enum class Hoge {
    FOO,
    BAR,
    BAZ,
    QUX, // 新しく増えた
}

elseを使ってると、enumに新しい値が増えたとしてもなにも言ってもらえません。

fun sample(hoge: Hoge): String {
    return when(hoge) {
        Hoge.FOO -> "FOO!"
        Hoge.BAR -> "BAR!!"
        else -> "Something else"
        // 普通にコンパイル通る
    }
}

仮に、「QUXの時は"QUX!!!"と出したい」という要件だったとしましょう。
でも、コンパイルエラーが出ないので、割と普通に修正漏れが発生してバグの温床になります。

一方elseを使わずにすべてのケースを網羅する形で書いていたら、新しいenumが増えた時にちゃんとコンパイラがエラーを出してくれます。

fun sample(hoge: Hoge): String {
    return when(hoge) {
        Hoge.FOO -> "FOO!"
        Hoge.BAR -> "BAR!!"
        Hoge.BAZ -> "Something else"
        // コンパイルエラー 
    }
}

これによって、「あ、ここも修正するんだった」ということに事前に気づけて、大変にハッピーです。

ということで、復唱します。
「Hey you, Kotlinでenumをwhenする時にelse使うなyo!」

14
3
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?