Video explicativo
En Java, un record es una nueva característica introducida en Java 14 que permite definir de manera concisa y fácilmente clases inmutables.
¿Qué es un Record en Java?
Un record es esencialmente una clase que define una estructura de datos con campos, pero a diferencia de una clase normal, un record es inmutable (es decir, sus campos no pueden ser modificados una vez que se han inicializado). Además, un record automáticamente genera métodos como equals(), hashCode() y toString() que se basan en los campos de la clase, lo que simplifica la definición de clases que se utilizan principalmente para almacenar datos.
Definiendo un record
Los records comparten bastante similitudes con las clases en java, la forma de definirlas es bastante similar. Para definir un record en Java, se utiliza la palabra clave “record”, seguida del nombre del record y los campos que contiene. Por ejemplo:
public record Persona(String nombre, int edad) { }
En este ejemplo, se define un record llamado “Persona” que tiene dos campos: “nombre” de tipo String y “edad” de tipo int.
Una vez que se ha definido un record, se pueden crear instancias de él de la misma manera que se crea una instancia de una clase normal:
Persona persona = new Persona("Juan", 30);
Accediendo a los atributos de un record
Como hemos dicho anteriormente, estos atributos son inmutables lo que significa que no podremos modificarlos, solo podremos iniciarlos a través del constructor y no podremos tener ningún setter. Sin embargo, podremos obtener estos atributos con los métodos que tendremos generados automáticamente en nuestro record.
En nuestro ejemplo anterior, Persona, podremos obtener “nombre” o “edad” de la siguiente forma:
Persona persona = new Persona("Juan", 30);
persona.nombre();
persona.edad();
A diferencia de los getters, accederemos al record directamente con el nombre del atributo cómo nombre del método.
Constructores en un record
Los constructores son algo básico en la creación de un objecto, para tener un record debemos tener un constructor por defecto pero también podremos tener más de un constructor o añadir alguna lógica en nuestro constructor por defecto.
Constructor por defecto
El constructor por defecto es el constructor que tenemos que definir siempre en nuestro record. En el caso anterior se define de la siguiente forma:
modificador de acceso record nombre del record (parámetros del constructor por defecto) {}
public record Persona(String nombre, int edad) { }
Pero también podemos añadirle lógica a nuestro constructor por defecto:
public record Persona(String nombre, int edad) {
public Persona {
if (nombre == null) {
nombre = "";
}
if (edad < 0) {
throw new IllegalArgumentException("No es posible que una persona tenga una edad negativa");
}
}
}
Multiples constructores
De la misma forma que tenemos en las clases, en los record también tenemos la posibilidad multiples constructores con el número de parámetros que queramos, pero siempre debemos inicializar los atributos del constructor por defecto. Veamos un ejemplo:
public record Persona(String nombre, int edad) {
public Persona(String nombre) {
this(nombre, 0);
}
public Persona(int edad) {
this("", edad);
}
public Persona(String nombre, int edad, String apellidos) {
this(nombre + " " + apellidos, edad);
}
}
En el ejemplo anterior vemos como tenemos un record con 4 constructores, 3 extras al constructor por defecto y siempre tendremos que llamar al constructor por defecto con la palabra clave “this“.
Métodos en un record
Los record también aceptan que creemos métodos propios dentro del record como podría ser en una clase normal. Veamos otro ejemplo:
public record Persona(String nombre, int edad) {
LocalDate calcularDiaDeNacimiento() {
return LocalDate.now().minusYears(edad);
}
}
En el ejemplo anterior tenemos el método “calcularDiaDeNacimiento” que ha sido creado dentro de nuestro record Persona y podremos llamarlo de la siguiente forma:
Persona persona = new Persona("Juan", 30);
persona.calcularDiaDeNacimiento();
Palabra clave static en un record
Por supuesto los métodos static y atributos con la palabra clave static también son aceptados en un record.
public record Persona(String nombre, int edad) {
public static int MAYORIA_EDAD = 18;
public static boolean isMenorDeEdad(int edad) {
return edad < MAYORIA_EDAD;
}
}