Clases Record
Las clases Record son un nuevo tipo de clases en el lenguaje Java, ayudan a modelar agregados de datos con menos ceremonia que las clases normales. Son clases que actúan como contenedores para datos inmutables, pueden ser considerados como tuplas. La declaración de un record mayormente consiste en la declaración de su estado. No es su objetivo resolver los problemas de las clases mutables que usan las convenciones de nombres de los JavaBeans. La palabra reservada es record y se usa en vez de class Un ejemplo de clase normal:
public class Point {
private final int x;
private final int y;
Point(int x, int y) {
this.x = x;
this.y = y;
}
int x() { return x; }
int y() { return y; }
public boolean equals(Object o) {
if (!(o instanceof Point)) return false;
Point other = (Point) o;
return other.x == x && other.y == y;
}
public int hashCode() {
return Objects.hash(x, y);
}
public String toString() {
return String.format("Point[x=%d, y=%d]", x, y);
}
}
Ejemplo con record:
public record Point(int x, int y) {}
Aspectos relevantes
Las clases Record adquieren automáticamente los siguientes elementos:
- Un campo privado y final por cada “atributo” o componente.
- Constructor: implica un constructor por parámetros a partir de los argumentos establecidos. Este aspecto puede ser modificable.
public record Person (String name, String address) {}
Person person = new Person("John Doe", "100 Linda Ln.");
- Getters y Setters: también existen pero se acceden con el nombre del atributo.
- Equals y hashCode: se genera un método equals() normal, devuelve true si los objetos son del mismo tipo y los campos de los objetos son iguales.
- toString: una implemetación de toString que incluye una representación de todos los componentes del registro con sus nombres.
Ejercicio 1
¿Qué ocurre con hashCode() y toString()? Compruébalo.
Método estáticos y variables
Permite crear variables estáticas en la declaración del record:
public record Person(String name, String address) {
public static String UNKNOWN_ADDRESS = "Unknown";
}
Person.UNKNOWN_ADDRESS
Y por último método estáticos:
public record Person(String name, String address) {
public static Person unnamed(String address) {
return new Person("Unnamed", address);
}
}
Person.unnamed("100 Linda Ln.");
## Limitaciones
- No pueden extender ninguna otra clase y no pueden declarar campos que no sean los privados automáticos que corresponden a los componentes de la descripción del estado en la descripción.
- Los registros son implícitamente final y no pueden ser abstract. Esto significa que no pueden ser mejorados por otra clase o registro.
- Los componentes de un registro son implícitamente final. Esta restricción hace que sean inmutables.
Nota final: también acepta patern matching que veremos a continuación.