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")
}
}