【Java学習|初心者向け】Javaのswitch式で安全なコードを書こう!Arrow Syntaxの「フォールスルーなし」を徹底解説

はじめに

Javaのswitch文は、条件分岐を分かりやすく記述できる便利な機能です。しかし、従来のswitch文には「フォールスルー」という、意図しない挙動を引き起こす可能性のある仕様がありました。Java 14で導入されたArrow Syntax (-> 構文) は、このフォールスルーをなくし、より安全で直感的なコードを書くことを可能にします。本記事では、このArrow Syntaxの「フォールスルーなし」のメリットと、具体的な使い方を初心者向けに解説します。

基礎知識:フォールスルーとは?

従来のJavaのswitch文では、`case` ラベルの終わりに `break` 文を記述しないと、次の `case` ラベルの処理に処理が流れてしまう「フォールスルー」が発生しました。

例えば、以下のようなコードを考えてみましょう。

int day = 3;
String dayName;
switch (day) {
case 1:
dayName = “月曜日”;
break;
case 2:
dayName = “火曜日”;
// break がない!
case 3:
dayName = “水曜日”;
break;
default:
dayName = “不明”;
}
System.out.println(dayName); // 出力は「水曜日」になる

この例では、`case 2` の後に `break` がないため、`day` が `2` の場合でも `case 3` の処理が実行され、`dayName` は「水曜日」になってしまいます。これは意図しない挙動であることが多く、デバッグの際に原因特定が難しいバグの原因となることがあります。

Arrow Syntax (-> 構文) でフォールスルーをなくす

Java 14から導入されたArrow Syntax (-> 構文) は、このフォールスルーを根本から解決します。Arrow Syntaxでは、`case` ラベルの後に `->` を使用し、その後に実行したい処理を記述します。この構文では、各 `case` の終わりに暗黙的に `break` が挿入されるため、フォールスルーが発生しません。

また、Arrow Syntaxはswitch文を「式」として扱えるようになり、処理結果を直接変数に代入できる「switch式」としても利用できます。

Arrow Syntaxの基本的な使い方

int day = 3;
String dayName;
switch (day) {
case 1 -> dayName = “月曜日”;
case 2 -> dayName = “火曜日”;
case 3 -> dayName = “水曜日”;
default -> dayName = “不明”;
}
System.out.println(dayName); // 出力は「水曜日」になる

このコードでは、`case 3` の後に `break` を書く必要はありません。`case 3` の処理が完了すれば、switch式全体が終了します。

switch式としての利用

switch式を使うと、より簡潔にコードを書くことができます。

int day = 3;
String dayName = switch (day) {
case 1 -> “月曜日”;
case 2 -> “火曜日”;
case 3 -> “水曜日”;
default -> “不明”;
};
System.out.println(dayName); // 出力は「水曜日」になる

このように、switch式の `}` の直前にセミコロン `;` をつけることで、switch式全体の結果を変数 `dayName` に代入しています。

サンプルプログラム

ここでは、Arrow Syntaxを使ったswitch式で、曜日から週末かどうかを判定する簡単なサンプルプログラムを紹介します。

public class SwitchArrowSyntaxExample {

public static void main(String[] args) {
int dayOfWeek = 6; // 6は土曜日を想定

// Arrow Syntaxを使ったswitch式で週末かどうかを判定
String isWeekend = switch (dayOfWeek) {
case 1, 2, 3, 4, 5 -> “平日”; // 月曜日から金曜日
case 6, 7 -> “週末”; // 土曜日、日曜日
default -> “無効な曜日”; // 1-7以外の値
};

System.out.println(“今日は” + isWeekend + “です。”); // 出力: 今日は週末です。

// 別の例:数値からアルファベットへの変換
int number = 3;
String alphabet = switch (number) {
case 1 -> “A”;
case 2 -> “B”;
case 3 -> “C”;
case 4 -> “D”;
case 5 -> “E”;
default -> “その他”;
};
System.out.println(number + “に対応するアルファベットは” + alphabet + “です。”); // 出力: 3に対応するアルファベットはCです。
}
}

このサンプルプログラムでは、

  • `case 1, 2, 3, 4, 5 -> “平日”;` のように、複数の `case` ラベルをカンマで区切って、同じ処理を適用することができます。
  • `switch` 式の結果を直接 `String` 型の変数に代入しています。

応用・注意点

  • switch式は必須ではありません: Arrow Syntaxはswitch文でも使用できます。どちらを使うかは、コードの可読性や目的に応じて選択してください。
  • switch式は網羅的である必要があります: switch式を使用する場合、`default` ケースを含め、すべての可能な値を網羅する必要があります。そうでない場合、コンパイルエラーになることがあります。ただし、`enum` 型など、値が限定されている型の場合は、`default` がなくてもコンパイルが通ることがあります。
  • 古いJavaバージョンでは使えません: Arrow SyntaxはJava 14以降で利用可能です。古いバージョンのJavaを使用している場合は、従来のswitch文と `break` を使ってフォールスルーを防ぐ必要があります。
  • yieldキーワード: switch式で、複雑な処理を行い、その結果を `yield` キーワードで返すことも可能です。これは、より高度な使い方になりますが、柔軟なコード記述を可能にします。

Arrow Syntaxの「フォールスルーなし」という仕様は、Javaコードの安全性を高め、開発者の負担を軽減する強力な機能です。ぜひ、日々のコーディングに取り入れてみてください。

コメント

タイトルとURLをコピーしました