Records
En Java 14 se introdujeron los records como una característica preliminar y, a partir de Java 16, se estabilizaron oficialmente. Los records son una nueva forma de definir clases en Java, especialmente para representar datos de forma sencilla e inmutable. Los records hacen que el código sea más conciso, ya que evitan la escritura repetitiva de métodos como getters.
Las características principales de los records son:
- Inmutabilidad por defecto: Los records son inmutables, lo que significa que una vez creados, sus valores no se pueden cambiar.
- Menos código repetitivo: Java genera automáticamente los getters, basándose en las propiedades del record.
La sintaxis de un record es muy similar a la de una clase, pero se usa para declarar un tipo de dato que normalmente solo contiene propiedades o campos. La sintaxis básica es la siguiente:
record NombreRecord(Tipo campo1, Tipo campo2, ...) { }
Donde NombreRecord es el nombre del record y campo1, campo2, etc., son las propiedades del record.
Veamos un ejemplo de un record que representa un usuario con nombre y edad.
public record Usuario(String nombre, int edad) { }
En este ejemplo, el record define automáticamente los métodos nombre() y edad() para acceder a los valores de los campos (similares a los getters).
Un record puede ser instanciado de manera similar a como se instanciaba un objeto de una clase regular, pero de forma más sencilla.
public class EjemploRecord {
public static void main(String[] args) {
// Crear un objeto record
Usuario usuario = new Usuario("Ana", 25);
// Acceder a los campos del record usando los métodos automáticos
System.out.println("Nombre: " + usuario.nombre());
System.out.println("Edad: " + usuario.edad());
// Usar el método toString() generado automáticamente
System.out.println(usuario);
}
}
Inmutabilidad
Los records son inmutables, lo que significa que una vez creado un objeto record, no puedes cambiar sus valores. No obstante, si necesitas "modificar" un record, lo que debes hacer es crear una nueva instancia del record con el valor actualizado.
Por ejemplo, para cambiar la edad de un Usuario, harías algo así:
Usuario usuario1 = new Usuario("Ana", 25);
// Crear un nuevo usuario con edad modificada
Usuario usuario2 = new Usuario(usuario1.nombre(), 26);
System.out.println(usuario1); // Usuario[nombre=Ana, edad=25]
System.out.println(usuario2); // Usuario[nombre=Ana, edad=26]
Métodos
Aunque los records son principalmente para almacenar datos, también puedes añadir métodos adicionales para realizar acciones basadas en sus campos.
public record Usuario(String nombre, int edad) {
// Método adicional para saber si el usuario es mayor de edad
public boolean esMayorDeEdad() {
return edad >= 18;
}
}
public class Ejemplo {
public static void main(String[] args) {
Usuario usuario = new Usuario("Ana", 25);
System.out.println(usuario.esMayorDeEdad()); // true
}
}
Constructores personalizados
Los records también permiten definir constructores personalizados para inicializar los campos del record de manera más controlada. Esto puede ser útil si necesitas realizar alguna validación antes de asignar los valores a los campos.
public record Usuario(String nombre, int edad) {
// Constructor personalizado
public Usuario {
if (edad < 0) {
throw new IllegalArgumentException("La edad no puede ser negativa.");
}
}
}
Limitaciones de los records
- Inmutabilidad: Los campos de un record no se pueden modificar una vez asignados, lo que significa que no se puede tener setters.
- Herencia: Un record no puede heredar de otra clase, pero puede implementar interfaces.
- Campos privados: Todos los campos de un record son implícitamente
privateyfinal.