しばらく放置していたが、Java 14から正式に追加されたSwitch Expressions、Java 21から追加されたPattern Matching for switchで既存の処理を書き換えることにした。
Java 11から21までの間のSwitch文の大きな変更は2つあって、分けて考えた方がわかりやすい。
Java 14で追加されたSwitch Expressions
これに書き換えることのメリットは2つと考えている。
1.breakが不要
Switch文から抜けるためのbreakが不要になった。breakがなくても同じように機能する。
例)変更前
switch (code) {
case 401, 403:
model.addAttribute("errorTitle", "403");
break;
case 404:
model.addAttribute("errorTitle", "404");
break;
default:
model.addAttribute("errorTitle", "error");
}
変更後
switch (code) {
case 401, 403 -> model.addAttribute("errorTitle", "403");
case 404 -> model.addAttribute("errorTitle", "404");
default -> model.addAttribute("errorTitle", "error");
};
2.無駄な記述が減る
breakが不要になったことも含めて、無駄な記述を減らせる。
例)変更前
int multiple = 0;
switch (unitSign) {
case M_BYTE:
multiple = 1024 * 1024;
break;
case K_BYTE:
multiple = 1024;
break;
case BYTE:
multiple = 1;
}
変更後
int multiple = switch (unitSign) {
case M_BYTE -> 1024 * 1024;
case K_BYTE -> 1024;
case BYTE -> 1;
};
Java 21で追加されたPattern Matching for switch
パターンマッチが使えるようになったが、正直すぐ使いそうなのはnullのチェックくらいだろうか。
例)変更前
public static FileConverter createConverter(FileType fileType) {
if (fileType == null) {
throw new FileException("errors.fileType");
}
switch (fileType) {
case XML:
return createXmlConverter();
case EXCEL:
return createExcelConverter();
case CSV:
return createCsvConverter();
default:
throw new FileException("errors.fileType");
}
}
変更後
public static FileConverter createConverter(FileType fileType) {
return switch (fileType) {
case XML -> createXmlConverter();
case EXCEL -> createExcelConverter();
case CSV -> createCsvConverter();
case null, default -> throw new FileException("errors.fileType");
};
}