Возврат за пределы включающего выражения переключателя

Я использую выражение переключения¹ в 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;
            }
        });
Другие вопросы по тегам