注目記事

【Javaコード入門】制御構文_②switch命令

式の値によって処理を分岐する – switch命令

switch(exp) {
 case val1:
  statements
 case val2:
  statements

 default:
  statements
}
 exp:任意の式
 val1、2…:expと比較する値

switch命令は、与えられた式(変数)の値によって、処理を分岐します。式の値は、char/byte/short/int/String/enum型のいずれかでなければなりません(ただし、String型を使えるのはJavaSE 7以降)。
たとえば以下は、変数valの値(1…3)に応じて対応するメッセージを表示します。それぞれの値に応じて実行する処理はcase句で、すべての値に合致しなかった場合に実行する処理はdefault句で表します。

StatSwitch.java
  1. package com.example.mynavi.control;
  2.  
  3. public class StatSwitch {
  4.  public static void main(String[​] args) {
  5.   var val = 3;
  6.   switch (val) {
  7.    case 1:
  8.     System.out.println("変数valは1です");
  9.     break;
  10.    case 2:
  11.     System.out.println("変数valは2です");
  12.     break;
  13.    case 3:
  14.     System.out.println("変数valは3です");
  15.     break;
  16.    default:
  17.     System.out.println("変数valは1、2、3いずれでもありません");
  18.     break;
  19.   } // 結果:変数valは3です
  20.  }
  21. }

なお、case、default句の末尾は、break命令で終わるのが原則です。さもないと、次の句が続けて実行されてしまいます。句の区切り目で、自動的にブロックを抜けるわけではない点に注意してください。

 

フォールスルー
ただし、あえて句の終わりに、break命令を指定しないこともあります。例えば以下のような場合です。

 

  1. switch (val) {
  2.  case 1:
  3.  case 2:
  4.   ...中略...
  5.   break;
  6.  case 3:
  7.   ...中略...
  8.   break;
  9. }

これによって、変数valが1、または2の場合に実行する命令群を表現できます。このような書き方をフォールスルーと言います。

Java14以降の新構文

Java 14以降では、switch命令に新たな構文が追加されました。

StatSwitchNew.java
  1. package com.example.mynavi.control;
  2.  
  3. public class StatSwitchNew {
  4.  public static void main(String[​] args) {
  5.   var lang = "Ruby";
  6.   String category = switch(lang) {
  7.    case "PHP", "Python", "Ruby" -> "スクリプト言語";
  8.    case "Java", "C#", "C" -> "プログラミング言語";
  9.    default -> "不明";
  10.   };
  11.   System.out.println(category); // 結果:スクリプト言語
  12.  }
  13. }

ポイントとなる構文は、以下です。

(1)switch式

switchが式として表現できます。つまり、文の中でswitch命令を記述できます。なお、switch式では値を返さないパターンがあってはいけないので、default句は省略不可です。

(2)アロー演算子

case/default句を「値 -> 対応する式」の形式で表せます。アロー演算子では、句の末尾のbreak命令は不要となります。

(3)case値の複数列記

case句に、カンマ区切りで値を列記できます。従来のようにcase句そのものを列記する必要はありません。

switchによるパターンマッチング

Java 21以降では、case句にリテラル値だけでなく、型を指定することも可能です。たとえば以下は、変数dataがDouble型の場合は整数に丸めた値を、String型の場合は先頭5文字を抜き出した結果を、nullの場合はその旨を、それぞれメッセージ表示する例です。

StatPattern.java

  1. package com.example.mynavi.control;
  2. public class StatPattern {
  3.   public static void main(String[​] args) {
  4.    Object data = 12.345;
  5.  
  6.    System.out.println(
  7.     switch(data) {
  8.      ★case Double d -> Math.floor(d);★
  9.      case String s -> s.substring(0, 5);
  10.      case null -> "null value...";
  11.      default -> "Unknown Type!!";
  12.     }
  13.    ); // 結果:12.0
  14.   }
  15. }

型を判定するには、「case 型名 変数」の形式でcase句を表します。指定された型に合致した場合、「変数」はそれぞれ対応するDouble、String型と見なされるので、型に応じたfloor、substringなどのメソッドを呼び出せる点に注目です。
型判定の構文には、条件式を加えることも可能です。たとえば以下は、先ほどのコード太字を条件式付きで書き換えたものです。

  1. case Double d ★when d < 10★ -> Math.floor(d);

これで式の値が「Double型で、10未満であること」という意味になります。結果、変数dataの値がマッチしなくなるため、結果は「Unknown Type!!」に変化します。

制御構文_目次
if命令
switch命令
while命令
do…while命令
for命令
拡張for命令
break命令
continue命令

監修

山田祥寛(有限会社 WINGSプロジェクト)
静岡県榛原町生まれ。一橋大学経済学部卒業後、NEC にてシステム企画業務に携わるが、2003年 4 月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト(https://wings.msn.to/)」の代表でもある。主な著書に『改訂 3 版JavaScript 本格入門』(技術評論社)、「独習シリーズ(C#・Python・PHP・Ruby・JSP&サーブレットなど)」(翔泳社)、「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravel など)」(Amazon Kindle)など。売り上げの累計は100万部を超える。