Kotlinにおけるwhen構文は、従来のJavaのswitch-caseに代わる、プログラムの実行フローを制御するための強力なツールです。whenは、表現力を高め、ボイラープレートコードを削減し、型安全性を向上させるために導入されました。
Javaのswitch-case構文は、特定の型(enum、int、String)のみに制限されており、Kotlinの開発者は、条件分岐をより表現豊かで安全にすることを目指しました。
Javaのswitch-caseの制限は、特にコレクションの操作、範囲の比較、さまざまな型の処理を行う際に、コードの拡張性とメンテナンス性を難しくします。
Kotlinのwhen構文は汎用的で、式として機能する(値を返すことができる)、条件チェック、範囲、単一の値、型、および条件の組み合わせをサポートしています。
fun describe(obj: Any): String = when (obj) { 1 -> "One" in 2..10 -> "From two to ten" is String -> "String with length ${obj.length}" else -> "Unknown" } val res1 = describe(1) // "One" val res2 = describe(5) // "From two to ten" val res3 = describe("Kotlin") // "String with length 6" val res4 = describe(42.0) // "Unknown"
whenは引数なしで使用できますか?
はい、whenは特定の変数の値をチェックする必要がない場合、長いif-elseチェーンの代わりに使用することができます。
when { x < 0 -> println("Negative") x == 0 -> println("Zero") else -> println("Positive") }
when構文でelseブロックは必須ですか?
すべての可能なケースが処理されている場合(たとえば、enumやsealedクラスの場合)、elseブロックは必須ではありません。しかし、未処理のケースがある可能性がある場合は、コンパイルエラーを避けるためにelseブロックが必要です。
sealed class Fruit object Apple : Fruit() object Pear : Fruit() fun check(f: Fruit): String = when (f) { Apple -> "It's an apple" Pear -> "It's a pear" // elseブロックは必要ない、すべてのケースが考慮されているため }
whenで複数の値を1つの節で使用できますか?
はい、複数の値をカンマで結合することができます。
when (value) { 0, 1 -> println("Zero or One") else -> println("Other") }
決済システムでは、switch-caseは取引のステータスを判断するために使用されます。新しいタイプのステータスを追加する際に、switchを更新するのを忘れました。未処理のステータスはsilent-errorを引き起こします。
利点:
欠点:
Kotlinでは、ステータスにsealedクラスを使用し、それを処理するためにwhen構文を使用しています。新しいステータスを追加した場合、コンパイラは新しいケースの処理を追加するよう要求します。
利点:
欠点: