1
0

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 3 years have passed since last update.

Kotlinのwhen式でEnumを判定した際にコンパイルエラーになるパターンとwarningになるパターン

Last updated at Posted at 2019-12-04

Kotlinのwhen式は様々な形でパターンマッチを行うことができ便利なので多用している人は多いと思います。
公式ドキュメント

特にwhen式に対しEnumを指定してやると、Enumの種類を増やした際に 'when' expression must be exhaustive とコンパイルエラーが出るため、網羅的な判定を型安全に行いたい場合に便利です。
例えば以下のような使い方をするとwhen式の箇所でコンパイルエラーになります。

enum class Type { A, B, C }

fun getName(type: Type): String {
	//ERROR: `Type.C`に対する判定が無い!!
    return when (type) {
        Type.A -> "a"
        Type.B -> "b"
    }
}

ところがwhen句にEnumを使ってさえいれば型安全だろうと安心するかもしれませんが、warningが出るのみでコンパイルは通ってしまう危険なケースもあることに注意する必要があります。
以下はwarningが出つつも通ってしまいます。(もし良ければなぜか考えてみてください)

fun outputLog(type: Type) {
    when (type) {
        Type.A -> println("a")
        Type.B -> println("b")
    }
}

答えは「when句の結果となる値がどこからも利用されていないためです」。
こういった場合は以下のように強引にreturn をつけてやりreturn Unitしてやることで型安全にすることができます。
※なお、結果の値が利用されさえすればいいので、他の手としては値を変数に一度入れるという手もあります。

fun outputLog(type: Type) {
    return when (type) {
        Type.A -> println("a")
        Type.B -> println("b")
    }
}
1
0
0

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
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?