You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Groovy升级后带@Deprecated与构造方法的枚举报意外令牌错误

Groovy升级后枚举@Deprecated与带参构造冲突的解决方案

问题根源

Groovy 3.x及以上版本的语法解析器对枚举项的注解位置处理逻辑发生了变化:当@Deprecated注解与带参数的枚举构造写在同一行时,解析器无法正确识别语法结构,抛出"意外令牌"错误。单独使用注解或带参构造时无此问题,属于版本升级后的兼容性语法冲突。

可行解决方案

1. 调整注解位置(最优方案)

将@Deprecated注解移到对应枚举项的单独一行,避免与构造方法调用在同一行。示例代码:

enum TestEnum {
    ONE("1"),
    @Deprecated
    TWO("2"),
    THREE("3")

    private final String value

    TestEnum(String value) {
        this.value = value
    }
}

这种写法符合Groovy新版本的语法解析规则,编译不会报错,同时保留了废弃注解的功能。

2. 使用全限定注解类名(备选)

如果坚持要在同一行写,尝试使用Java注解的全限定类名(部分版本可能兼容):

enum TestEnum {
    ONE("1"),
    java.lang.Deprecated TWO("2"),
    THREE("3")

    private final String value

    TestEnum(String value) {
        this.value = value
    }
}

注意:部分高版本Groovy可能仍不支持此写法,优先推荐方案1。

3. 临时兼容编译参数(不推荐长期使用)

在Maven的Groovy编译配置中添加旧语法兼容参数,强制解析器使用2.5.x版本的语法规则。修改groovy-maven-plugin配置:

<plugin>
    <groupId>org.codehaus.gmavenplus</groupId>
    <artifactId>gmavenplus-plugin</artifactId>
    <version>1.13.1</version>
    <executions>
        <execution>
            <goals>
                <goal>compile</goal>
            </goals>
        </execution>
    </executions>
    <configuration>
        <compilerArgs>
            <arg>-Dgroovy.antlr4.skip=true</arg> <!-- 禁用新ANTLR4解析器,回退旧版逻辑 -->
        </compilerArgs>
    </configuration>
</plugin>

此方法可能导致其他新语法特性无法使用,仅作为临时过渡方案。

错误场景代码示例

触发报错的原写法:

enum TestEnum {
    ONE("1"),
    @Deprecated TWO("2"), // 此处抛出"意外令牌"错误
    THREE("3")

    private final String value

    TestEnum(String value) {
        this.value = value
    }
}

关联POM配置片段

<dependency>
    <groupId>org.codehaus.groovy</groupId>
    <artifactId>groovy-all</artifactId>
    <version>3.0.17</version> <!-- 或其他3.x/4.x版本 -->
    <type>pom</type>
</dependency>

内容的提问来源于stack exchange,提问作者user4880619

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 08:09:55