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

"patterns in switch statements are a preview feature and are disabled by default" when switching to java 17 - what is the right solution?

提问人:Ivajlo Iliev 提问时间:11/17/2023 最后编辑:Ivajlo Iliev 更新时间:11/17/2023 访问量:35

问:

我正在努力将一些项目从 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-语句 java-17

评论

1赞 Holger 11/17/2023
由于代码的语法未更改,因此应检查是否仍解析为新环境中的类型。HttpMethodenum
0赞 Ivajlo Iliev 11/17/2023
不幸的是,它在spring-web 6.0.2中没有解决,那么在这种情况下的解决方案是什么?
2赞 Holger 11/17/2023
首先,您应该在问题中包括您更新了 Spring Web 版本。然后,如果框架作者有一个将类型更改为非类型的光荣想法,你就不能再重复它了。将 or a from 对象用于处理程序或类似。或者切换其字符串。enumenumswitchif … elseMapname()
0赞 Eugene 11/18/2023
@Holger Spring 的主要版本中允许此类重大更改,例如在本例中。

答:

2赞 Holger 11/17/2023 #1

该类型已从枚举类型更改为枚举类型。因此,你不能再超过它了。错误消息令人困惑,因为您可以使用模式匹配切换非类型,因此编译器假定您正在尝试这样做。HttpMethodswitchenum

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

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));
}