GMOアドマーケティングのT.Nです。
Java 14でSwitch ExpressionsがPreviewからStandardになりました。
Switch Expressionsについては既に多くの記事や説明が存在すると思いますが、
今回は自分がSwitch Expressionsに慣れるためにソースコードを書いて動かしてみました。
Switch Expressionsとは
Switch Expressionsを日本語にするとSwitch式です。
Switch文から値を返せるようになり、式として扱えるようになりました。
Switch ExpressionsはJava 12でPreviewとして追加されました。
Java 12での変更点
- ラベルに矢印(->)を使用できるようになった
- ラベルを複数指定できるようになった
- 値を返せるようになった
ソースコードで説明すると以下のようになります。
1 2 3 4 5 |
WorkStyle workStyle = switch (dayOfWeek) { case MONDAY, THURSDAY, FRIDAY -> WorkStyle.GO_TO_OFFICE; case TUESDAY, WEDNESDAY -> WorkStyle.WORK_FROM_HOME; case SATURDAY, SUNDAY -> WorkStyle.HOLIDAY; }; |
渡されたenumの定数(曜日)に応じて、勤務形態を返す処理です。
Switch式を使用すると、このように分岐と代入を簡潔に行うことができます。
ちなみに、この例では火曜日と水曜日が在宅勤務ということになっていますが、
現在GMOインターネットグループでは週1-3日の在宅勤務が推奨されていて、
GMOアドマーケティングのエンジニアはチームごとに出社日をずらして、
週に2日在宅勤務を行っています。
矢印(->)を使用した場合は、
fall throughが行われないという点も重要です。
Switch文でbreakを書かないと、
一度ラベルに一致したらfall throughが行われ、
後続のcaseの処理も実行されますが、
矢印を使用した場合は、fall throughは行われません。
fall throughが行われる例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
var dayOfWeek = MONDAY; switch (dayOfWeek) { case MONDAY: case THURSDAY: case FRIDAY: System.out.println("出社"); case TUESDAY: case WEDNESDAY: System.out.println("在宅勤務"); case SATURDAY: case SUNDAY: System.out.println("休日"); } // 出社 // 在宅勤務 // 休日 // の3つが出力される |
fall throughが行われない例
1 2 3 4 5 6 7 |
var dayOfWeek = MONDAY; switch (dayOfWeek) { case MONDAY, THURSDAY, FRIDAY -> System.out.println("出社"); case TUESDAY, WEDNESDAY -> System.out.println("在宅勤務"); case SATURDAY, SUNDAY -> System.out.println("休日"); } // 出社だけが出力される |
これにより、breakの書き忘れにより意図しない実行結果になることを防ぐことができます。
Java 13での変更点
- yieldが追加された
Java 12では、Switch式から値を返す場合に、
breakの後に値を記述していましたが、
Java 13からは、yieldの後に記述するようになりました。
yieldの使用例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
WorkStyle workStyle = switch (dayOfWeek) { case MONDAY, THURSDAY, FRIDAY -> { System.out.println("出社"); yield WorkStyle.GO_TO_OFFICE; } case TUESDAY, WEDNESDAY -> { System.out.println("在宅勤務"); yield WorkStyle.WORK_FROM_HOME; } case SATURDAY, SUNDAY -> { System.out.println("休日"); yield WorkStyle.HOLIDAY; } }; |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
WorkStyle workStyle = switch (dayOfWeek) { case MONDAY: case THURSDAY: case FRIDAY: System.out.println("出社"); yield WorkStyle.GO_TO_OFFICE; case TUESDAY: case WEDNESDAY: System.out.println("在宅勤務"); yield WorkStyle.WORK_FROM_HOME; case SATURDAY: case SUNDAY: System.out.println("休日"); yield WorkStyle.HOLIDAY; }; |
コロン(:)のラベルを使う場合は、
yieldを書かないと、Switch文でbreakを書かなかった場合と同じように、
fall throughが行われるので注意が必要です。
Switch式から値を返す場合にはyield、
Switch文でfall throughを中断する場合にはbreak、
というように使い分けます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
switch (dayOfWeek) { case MONDAY: case THURSDAY: case FRIDAY: System.out.println("出社"); break; case TUESDAY: case WEDNESDAY: System.out.println("在宅勤務"); break; case SATURDAY: case SUNDAY: System.out.println("休日"); break; } |
まとめ
今回のブログを通してSwitch Expressionsについて学ぶことができました。
新機能が増えると開発も楽しくなると思うので、
今後もJavaに新機能が追加されていくことを期待しています。