En palabras simples, ¿cuál es la diferencia entre una clase final y un registro en Java 17?
¿En qué caso debo usar un registro?
Record es una clase inmutable , es decir, todos sus campos son final . Los registros son implícitamente final , por lo tanto, al igual que el record de clase final regular, no se pueden extender .
Hay una serie de restricciones impuestas a los registros ( para más detalles, consulte JEP 395 ).
Al contrario de las clases normales :
final , lo cual es una distinción muy impotente );extends no está permitida con registros , porque cada registro extiende implícitamente la clase abstracta Record ;abstract , sealed o non-sealed (como consecuencia de ser implícitamente final );Los registros están destinados a ser "portadores transparentes de datos inmutables" , como dice JEP 395 .
Están diseñados para ser concisos , el compilador generará el constructor predeterminado , getters , hashCode/equals y toString() para usted. De modo que dentro de un registro necesita declarar solo su lógica personalizada ( si la hay ) y la declaración del registro puede ser literalmente una sola línea .
Los récords difieren mucho de las clases finales regulares.
Además, además de las peculiaridades mencionadas anteriormente, se reimplementó el mecanismo de serialización/deserialización para los registros , para que la deserialización no pase por alto al constructor.
¿En qué caso debo usar un registro?
En resumen, si sus objetos deben tener estado o necesita extender una clase en particular, entonces no puede utilizar record en tal caso.
Por otro lado, si sus objetos solo contienen datos , no están destinados a ser modificados o heredados de otras clases, entonces podría ser un buen candidato para implementarse como un record .
Una clase final es simplemente una que no se puede extender. Pero eso no impone otras restricciones a la clase; todavía puede tener campos mutables, encapsular completamente su estado, etc.
Un record es un portador transparente para una tupla determinada de componentes de estado y se requiere para exponer una API derivada de su descripción de estado. Por lo tanto, los registros están más restringidos, pero a cambio de estas restricciones, obtiene una gran comodidad (constructores, métodos de acceso, métodos de Object ), así como algunas promesas semánticas (p. ej., desempaquetar un registro con sus componentes de acceso y volver a empaquetar los resultados). con el constructor te da un objeto equals .)
Los récords también son clases final , pero esto es una parte muy pequeña de lo que significa ser un récord.