Java中record已成为关键字,将其用作变量名是否合法?
关于Java中record可作为变量名的原因解释
Java的关键字分为两类:保留关键字 和 上下文关键字(受限关键字),你遇到的现象正是这两类关键字的差异导致的:
- 保留关键字(比如
class、const、int等)是全局生效的,在代码的任何位置都不能被用作变量名、类名等标识符,这也是你声明名为class的变量会直接报错的原因。 - 上下文关键字仅在特定的语法场景下才会被识别为关键字,其余场景下可作为普通标识符使用,
record就属于这类关键字。
你给出的测试代码完全符合语法规则:
public class Main { static class Foo { void bar() { System.out.println("Foo.bar"); } } record R (int a) {} public static void main(String[] args) { Foo record = new Foo(); record.bar(); R r = new R(5); System.out.println(r); } }
在这段代码中:
- 写
record R (int a) {}时,record处于类型声明的起始位置,符合record关键字的触发上下文,因此会被识别为关键字,用于定义记录类。 - 写
Foo record = new Foo();时,record处于变量名的位置,不属于record关键字的触发上下文,因此会被当成普通标识符处理,不会触发编译错误。
该设计确实是Java开发团队刻意为之,核心目的是保证向前兼容性:record是Java 16才正式转正的语法特性,如果直接将其设为全局保留关键字,会导致大量在Java 16之前就用record作为变量名、类名的旧代码无法升级到新版本JDK,不符合Java的兼容性承诺。
你提到的const属于保留关键字,从Java语言规范初代版本开始就被列为保留关键字,至今没有实际使用,但依旧全局禁止作为标识符使用,和record的定位完全不同。
上述代码在Java 17环境下的运行结果完全符合预期:
Foo.bar R[a=5]
内容的提问来源于stack exchange,提问作者Axel
相关产品推荐
相关产品推荐

