Возврат за пределы включающего выражения переключателя - PullRequest
6 голосов
/ 28 июня 2019

Я использую выражение переключения switch в 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 Ответ

10 голосов
/ 28 июня 2019

использование yield в Java 13

В Java 13 выражения переключения используют новое ключевое слово 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;
            }
        });
...