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
相关产品推荐
相关产品推荐

