Me encanta el proyecto Lombok pero en estos días estoy leyendo y probando algunas de las nuevas características de Java 14.
Dentro de la nueva capacidad, existe la palabra clave record que permite crear una clase con la siguiente funcionalidad incorporada: constructor, campos finales privados, accesores, equals / hashCode, getters, toString.
Ahora mi pregunta es: es mejor confiar en la función de Lombok o deberíamos comenzar a usar la funcionalidad de registro:
Es mejor usar esto:
record Person (String name, String surname) {}
o eso:
@AllArgsConstructor
@ToString
@EqualsAndHashCode
public class GetterSetterExample {
@Getter private int name;
@Getter private int surname;
}
¿Cuáles son los pros y los contras de ambos enfoques?
record
no funcionará para las cosas que esperan getters y setters de estilo JavaBeans.alice.phoneNumber()
lugar de la convención JavaBeans de prefijar conget
, como enalice.getPhoneNumber()
.record
función es una función de vista previa , aún no está lista para su uso en producción.Respuestas:
Lombok y el
record
característica del lenguaje Java, son diferentes herramientas para diferentes cosas. Hay una superposición superficial, pero no dejes que eso te distraiga.Lombok se trata principalmente de conveniencia sintáctica ; Es un macroprocesador precargado con algunos patrones de código útiles conocidos. No confiere ninguna semántica; solo automatiza los patrones, de acuerdo con algunas perillas que configuró en el código con anotaciones. Lombok es puramente sobre la conveniencia de implementar clases portadoras de datos.
Los registros son una característica semántica ; Son tuplas nominales . Al hacer una declaración semántica que
Point
es una tupla de(int x, int y)
, el compilador puede derivar su representación, así como los protocolos de construcción, declaración, igualdad, hash y representación de cadenas, a partir de esta descripción de estado. Debido a que tienen semántica, los lectores y los marcos también pueden razonar con mayor confianza sobre la API de los registros. (Esto también puede ser sintácticamente conveniente; si es así, eso es genial).fuente
He estado jugando con esta combinación durante algún tiempo también y con un poco de práctica podría enumerar las siguientes diferencias:
Lombok
@Getter, @AllArgsConstructor, @ToString, @EqualsAndHashCode
.EqualsAndHashCode
usted mismo, no es lo mismo que esperaría cuando se trata de migrar a registros .Registros
Por supuesto, en el día a día, siempre es sabio basarse en los requisitos de un proyecto para elegir qué camino seguir y practicar.
fuente
NB: en lugar de ese árbol de Navidad de anotaciones, puedes usarlo
@Value
en la clase. Tenga en cuenta que esto hace que la clase sea final, y hace que todos los campos sean privados y finales, y también le brinda todo el resto. Esto está cerca de lo que son los registros (ellos también son finales, y todos los campos dentro son finales).record
todavía está en la vista previa, por lo que para el código de producción, obviamente, aún no es adecuado. Usa lombok.Una vez que los registros están fuera de la vista previa, es más complicado. Lombok es MUCHO más flexible; puede cambiar fácilmente algún aspecto nuevo sin tener que reescribir todo el código (puede simplemente, por ejemplo, agregar una cláusula 'extend' a su clase sin tener que escribir a mano el método igual y hashCode; algo que los registros no pueden proporcionarle). Lombok también le ofrece más funciones: por ejemplo, puede agregar un generador agregando la
@Builder
anotación; No es algo que los registros puedan hacer.Si es muy poco probable que vayas a usar algo de eso para la clase que estás diseñando, usaría registros.
DESCARGO DE RESPONSABILIDAD: Soy un contribuidor principal del Proyecto Lombok.
fuente