Records preview en JDK 14 ea

Hoy escribiré un ejemplo del uso del nuevo type declaration Record en una versión del JDK 14 
Early-Access Builds.

¿Que es un Record?


Es una nueva declaración de tipo, similar a una clase con las siguientes características (descritas en el JEP 359):

  • tiene un nombre y un state description que define sus componentes.
  • cada componente del estado tiene un método de acceso público con el mismo nombre del componente.
  • tiene un constructor público con la misma firma que el state description en el cual se inicializa cada campo desde el argumento.
  • implementa equals y hashCode, en donde 2 records serán iguales si son del mismo tipo y contienen el mismo estado.
  • implementa toString con la representación de todos sus componentes.
  • cada componente del state description es private final.
  • no pueden extender otras clases.
  • no pueden tener otros campos de instancia, solo los del state description.
  • si se definen otros campos tienen que ser static.
  • un record es final y no puede ser abstracto.
  • puede implementar interfaces.
  • su body es opcional.
  • como es preview, puede cambiar en el futuro.

Creando un Record

Un ejemplo de record es el siguiente:
record Persona(int edad, String nombre) {}
y eso es todo 👽 tenemos nuestro record Persona que en el state description define los componentes edad y nombre. Para instanciarlo realizamos lo siguiente:
final var p1 = new Persona(12, "Persona 1");
ahora p1 tiene edad = 12 y nombre = "Persona 1", y los métodos para acceder a ellos son:
p1.edad();
p1.nombre();

Y al mostrar el contenido con System.out obtenemos lo siguiente:
Persona[edad=12, nombre=Persona 1]

Compilación

  • descargar la JDK 14 ea y asociarlo al JAVA_HOME:
    export JAVA_HOME=/path/jdk-14
  • agregar la opción para que maven tenga habilitada la opción preview al ejecutar la clase main:
    export MAVEN_OPTS=--enable-preview
  • configurar el plugin de maven con --enable-preview en la compilación:
    <plugin>
     <groupId>org.apache.maven.plugins</groupId>
     <artifactId>maven-compiler-plugin</artifactId>
     <version>3.8.1</version>
     <configuration>
         <release>14</release>
         <compilerArgs>--enable-preview</compilerArgs&gt
     </configuration>
    </plugin>
Eso es todo, el código fuente está en Github y se ejecuta con:
mvn compile exec:java