K4750.NET

Java13プレビュー機能「拡張switch」を試す

まだプレビュー機能なので、デフォルトでは有効ではないが(有効にするには、JVM起動オプションに –enable-preview が必要)、Java13から「switch」が文(statement)だけではなく式(expression)としても使えるようになったので、試してみる。


1.switch文(case …:)

従来の書き方。フォールスルーするので、break文が必要。

switch (day) {
    case MONDAY:
    case FRIDAY:
    case SUNDAY:
        System.out.println(6);
        break;
    case TUESDAY:
        System.out.println(7);
        break;
    case THURSDAY:
    case SATURDAY:
        System.out.println(8);
        break;
    case WEDNESDAY:
        System.out.println(9);
        break;
}

2.switch文(case … ->)

switch文の別の書き方として「:」の代わりに「->」を書くと、フォールスルーせず、break文は不要。

switch (day) {
    case MONDAY, FRIDAY, SUNDAY -> System.out.println(6);
    case TUESDAY                -> System.out.println(7);
    case THURSDAY, SATURDAY     -> System.out.println(8);
    case WEDNESDAY              -> System.out.println(9);
}

複数文を記述したい場合は「{}」で括る。

switch (day) {
    case MONDAY, FRIDAY, SUNDAY -> System.out.println(6);
    case TUESDAY                -> System.out.println(7);
    case THURSDAY, SATURDAY     -> System.out.println(8);
    case WEDNESDAY              -> { System.out.println(9); System.out.println(10); }
}

3.switch式(case …:)

式としてswitchを使う場合は、yieldで値を返す必要がある。

System.out.println(switch (day) {
    case MONDAY, FRIDAY, SUNDAY: yield 6;
    case TUESDAY: yield 7;
    case THURSDAY, SATURDAY: yield 8;
    case WEDNESDAY: yield 9;
});

フォールスルーするので、以下の書き方も可能。

System.out.println(switch (day) {
    case MONDAY:
    case FRIDAY:
    case SUNDAY:
        yield 6;
    case TUESDAY:
        yield 7;
    case THURSDAY:
    case SATURDAY:
        yield 8;
    case WEDNESDAY:
        yield 9;
});

4.switch式(case … ->)

式でも「->」が使える。この場合は、yieldの省略が可能。

System.out.println(switch (day) {
    case MONDAY, FRIDAY, SUNDAY -> 6;
    case TUESDAY -> 7;
    case THURSDAY, SATURDAY -> 8;
    case WEDNESDAY -> 9;
});

複数文を記述する等「{}」を使う場合は、明示的にyieldを書く必要がある。

System.out.println(switch (day) {
    case MONDAY, FRIDAY, SUNDAY -> 6;
    case TUESDAY -> 7;
    case THURSDAY, SATURDAY -> 8;
    case WEDNESDAY -> { System.out.println("(WEDNESDAY)"); yield 9; }
});