Esto fue una sorpresa: puedo declarar una variable con el record de nombre aunque ahora se haya convertido en una palabra clave. Echa un vistazo a esto:
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); } }Cuando se compila y ejecuta con Java 17, esto da:
Foo.bar R[a=5] Esperaba que esto diera como resultado un error, como es el caso cuando se intenta declarar una variable llamada class . Como conozco a los muchachos de Java, tienen mucho cuidado de no romper el código existente, por lo que creo que esta podría ser una elección deliberada.
(Ni siquiera puede declarar una variable llamada const porque esa const es una palabra clave en Java).
Sí, esto es legal porque record no es una palabra clave reservada ; es solo una palabra clave contextual .
La especificación del lenguaje Java ha distinguido entre palabras clave contextuales (originalmente "palabras clave restringidas" y luego "identificadores restringidos") y palabras clave reservadas desde Java 9, debido a la introducción de varias palabras clave nuevas en esa versión. La justificación se da en JLS 9 ( §3.9 ):
Otras diez secuencias de caracteres son palabras clave restringidas:
open,module,requires,transitive,exports,opens,to,uses,providesywith. Estas secuencias de caracteres se tokenizan como palabras clave únicamente cuando aparecen como terminales en las produccionesModuleDeclarationyModuleDirective(§7.7). Se tokenizan como identificadores en cualquier otro lugar, por compatibilidad con programas escritos antes de Java SE 9.
Esencialmente, Foo record = new Foo(); tiene que ser legal en Java 17 porque lo era en versiones anteriores cuando record no era ningún tipo de palabra clave, y la compatibilidad con versiones anteriores es una prioridad muy alta para las nuevas versiones del lenguaje Java.
Bien, mientras buscaba const en el JLS nuevamente, vi que record es una palabra clave contextual mientras que const es solo una palabra clave . Las palabras clave contextuales se analizan según el contexto, y cuando el analizador determina que no está mirando una declaración de registro, no se quejará.