切换到 java 17 时“switch 语句中的模式是预览功能,默认情况下处于禁用状态” - 正确的解决方案是什么?

问题描述 投票:0回答:1

我正在努力将一些项目从 java 11 迁移到 java 17,以及从 Spring Boot 2.7.8 迁移到 Spring Boot 3.0.0。

我在测试类中有以下方法:

    protected void stub(HttpMethod method, String url, ResponseDefinitionBuilder response) {
        switch (method) {
            case GET:
                wireMockServer.stubFor(get(urlMatching(url)).willReturn(response));
                break;
            case POST:
                wireMockServer.stubFor(post(urlMatching(url)).willReturn(response));
                break;
            case PUT:
                wireMockServer.stubFor(put(urlMatching(url)).willReturn(response));
                break;
            case DELETE:
                wireMockServer.stubFor(delete(urlMatching(url)).willReturn(response));
                break;
            default:
                throw new RuntimeException("invalid http method");
        }
    }

使用 java 11 时,但是当我切换到 java 17 并在 pom.xml 中指定了以下内容:

 <properties>
        <java.version>17</java.version>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>3.0.0</version>
        <relativePath/>
    </parent>

代码因以下错误而停止工作:

patterns in switch statements are a preview feature and are disabled by default.

显然它会干扰 java 17 中的模式匹配预览功能。

正确的解决方案是什么?

switch-statement java-17
1个回答
0
投票

类型

HttpMethod
已从an
enum
类型
更改为
enum
类型
。因此,你不能再
switch
了。错误消息令人困惑,因为您可以使用模式匹配切换非
enum
类型,因此编译器假设您正在尝试这样做。

另一种方法是切换字符串表示形式。这也是清理这段代码的机会:

protected void stub(HttpMethod method, String url, ResponseDefinitionBuilder response) {
    var um = urlMatching(url);
    var processed = switch(method.name()) {
        case "GET" -> get(um);
        case "POST" -> post(um);
        case "PUT" -> put(um);
        case "DELETE" -> delete(um);
        default -> throw new RuntimeException("invalid or unsupported http method");
    };
    wireMockServer.stubFor(processed.willReturn(response));
}
© www.soinside.com 2019 - 2024. All rights reserved.