Возврат за пределы включающего выражения переключателя
Я использую выражение переключения¹ в Java 12 для преобразования строки в метод HTTP:
static Optional<RequestMethod> parseRequestMethod(String methodStr) {
return Optional.ofNullable(
switch (methodStr.strip().toUpperCase(Locale.ROOT)) {
case "GET" -> RequestMethod.GET;
case "PUT" -> RequestMethod.PUT;
case "POST" -> RequestMethod.POST;
case "HEAD" -> RequestMethod.HEAD;
default -> {
log.warn("Unsupported request method: '{}'", methodStr);
return null;
}
});
}
Я хотел бы предупредить о неподдерживаемом методе в ветке по умолчанию и вернуть null (который затем оборачивается в необязательный).
Но приведенный выше код вызывает ошибку компилятора:
Возврат за пределы включающего выражения переключателя
Как мне получить это для компиляции?
Для полноты вот определение RequestMethod
перечисление:
enum RequestMethod {GET, PUT, POST, HEAD}
¹ выражения переключения были введены в Java 12 в качестве функции предварительного просмотра.
1 ответ
Решение
использование yield
в Java 13
В Java 13 в выражениях переключения используется ключевое слово new yield
вернуть значение из блока:
return Optional.ofNullable(
switch (methodStr.strip().toUpperCase(Locale.ROOT)) {
case "GET" -> RequestMethod.GET;
// ... rest omitted
default -> {
log.warn("Unsupported request method: '{}'", methodStr);
// yield instead of return
yield null;
}
});
использование break
в Java 12
В Java 12 выражения выражений используют break
вернуть значение из блока:
return Optional.ofNullable(
switch (methodStr.strip().toUpperCase(Locale.ROOT)) {
case "GET" -> RequestMethod.GET;
// ... rest omitted
default -> {
log.warn("Unsupported request method: '{}'", methodStr);
// break instead of return
break null;
}
});