Kotlin 1.5.30からOpt-inにて Exhaustive when statements が試せるようになったので、これについて解説します。
現状
これを書いてる最新バージョンであるKotlin 1.5.30までの sealed class/interface と Boolean の when
ですが、以下のようにすべてを網羅しなくてもビルド時に警告などは表示されません。(IDE上での警告は表示されてました)
ただし、以下のように when
から戻り値を受け取るような場合にはコンパイルエラーになります。
以前から要望として、戻り値を受け取らない場合などでも網羅チェックをしてほしいというのがありました。
exhaustive when statement
Kotlin 1.5.30からOpt-inにてexhaustive when statementを有効にすることができます。
有効にするには build.gradle
に以下のように記述します。
この状態でsealed class/interface と Boolean を網羅せずにビルドすると以下のような警告が表示されます。
Non exhaustive 'when' statements on sealed class/interface will be prohibited in 1.7, add 'Error' branch or 'else' branch instead
Kotlin 1.6からはデフォルトでこのような警告が表示されるようになります。
更に build.gradle
に progressiveMode = true
に追加することで警告ではなくエラーにすることも出来ます。
これで網羅せずにビルドすると以下のようなエラーになります。
'when' expression must be exhaustive, add necessary 'Error' branch or 'else' branch instead
これからの対応
Kotlin 1.6では when
で網羅されていない sealed class/interface と Boolean では警告が表示されるようになります。
Kotlin 1.7では警告がエラーになる予定です。
Opt-inして早めに網羅されてないものがないかをチェックしておくと、後々安心かもしれません。