Hoy voy a presentar Lombok, una solución que nos permite evitar tener que escribir una y otra vez ese código repetitivo, que tantas veces tenemos que implementar en nuestras clases. Getters y Setters se reducen a una única línea de código.
Índice de contenidos
- 1. Introducción
- 2. Entorno
- 3. Un primer acercamiento
- 4. Instalando Lombok
- 5. Algunas características de Lombok
- 6. Implementación del patrón Builder
- 7. Anotaciones para el tratamiento de logs
- 8. Referencias
1. Introducción
En nuestras clases Java hay mucho código que se repite una y otra vez: constructores, getters y setters. Métodos que quedan definidos una vez que dicha clase ha concretado sus propiedades, y que salvo ajustes menores, serán siempre sota, caballo y rey. Con Lombok se hace eso mismo: definimos las propiedades y nos despreocupamos. Con unas pocas anotaciones cubrimos casi todos los casos que se pueden dar.
2. Entorno
Para escribir este tutorial he usado el siguiente entorno:
- Hardware: Portátil MacBook Pro Retina 15″ (2,5 GHz Intel Core i7, 16GB DDR3).
- Sistema Operativo: Mac OS X El Capitán
- Entorno de desarrollo: Eclipse Mars .1
- Atom 1.4.0 para redactar este post
3. Un primer acercamiento
Primero veamos qué puede hacer Lombok por nosotros y luego veamos cómo conseguirlo.
En la imagen anterior se observa como apenas hemos declarado la clase y unas pocas propiedades. Sin embargo, en la ventana de outline de Eclipse se ven todos los getters, setters, el constructor y algún otro método como equals, canEquals, hashCode y toString. Y lo único que se ha hecho es anotar la clase con @Data y añadir su correspondiente import. Está claro que para que esto ocurra, nuestro IDE debe reconocer lombok, y por otro lado, nuestro proyecto debe importar la librería.
4. Instalando Lombok
Desde la web del proyecto Lombok se puede descargar un jar, que debería poder instalarse con un simple doble click. En el caso de que esto no funcionara habría que recurrir a la línea de comandos y ejecutar:
java -jar lombok.jar
El instalador intentará descubrir los IDEs que tienes instalados y preguntará en cuales quieres instalar Lombok. En este equipo me detectó el Eclipse. En caso de que no encuentre ninguno de los que soporta, se puede indicar dónde está instalado el IDE en el que queremos añadir lombok.
También hay que añadir el JAR al proyecto donde lo queramos usar. Lo podemos añadir como dependencias de maven en el pom.xml
<dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.16.6</version> <scope>provided</scope> </dependency>
5. Algunas características de Lombok
Ya hemos visto lo que puede hacer la anotación @Data por nosotros. Pero hay muchas otras. Algunas de las más reseñables son:
- @Getter
- @Setter
- @NoArgsConstructor
- @AllArgsConstructor
- @Builder
- @Log
La mayoría son autoexplicativas y no merece la pena profundizar en ellas. Baste con un par de experimentaciones rápidas para darse cuenta de que lo que hacen es lo que dice la anotación. En este sentido, lombok es muy intuitivo.
En el ejemplo anterior, hemos anotado la clase con @NoArgsConstructor y @AllArgsConstructor, y comprobamos que el resultado en el outline, es que tenemos dos constructores: uno sin argumentos y otro con todos los argumentos.
A nivel de propiedades, hemos anotado una con @Setter y otra con @Getter, y automáticamente nos genera dichos métodos para esas propiedades. Estas anotaciones se pueden usar a nivel de clase, y generaría esos métodos para todas las propiedades. Muy fácil.
6. Implementación del patrón Builder
Lombok también nos permite implementar el patrón Builder de forma efectiva en nuestro código, únicamente debemos anotar la clase con @Builder, y automáticamente nos creará el método público build y el objeto estático Builder con todos sus atributos y métodos.
Para quien no lo conozca, en el siguiente enlace se muestra el funcionamiento del patrón Builder de forma muy didáctica.
De esta forma siempre podremos hacer:
private Usuario cliente = new Usuario.UsuarioBuilder() .id(102) .nombre("Alejandro") .primerApellido("Magno") .mail("correo@ejemplo.com") .build();
7. Anotaciones para el tratamiento de logs
Hay seis posibles anotaciones de clase para el tratamientos de logs que crean la variable estática, privada y final log, dependiendo del sistema con el que se desee registrar las trazas.
- @CommonsLog
- @Log
- @Log4j
- @Log4j2
- @Slf4j
- @XSlf4j
Se pueden ver explicadas con más detalle en la página oficial
El resultado es que de forma sencilla y efectiva podemos tener control sobre nuestros POJOs con unas simples anotaciones, permitiéndonos aislarnos de la «morralla» habitual vinculada al tratamiento de este tipo de clases, que en el caso de modelos de datos con numerosos atributos, pueden ser muy tediosos de gestionar, aunque los IDEs actuales nos ayuden a ello.
8. Referencias
- Web Oficial de Lombok
https://projectlombok.org - Tutorial algo antañón
http://jnb.ociweb.com/jnb/jnbJan2010.html - Explicación del patrón Builder
https://jlordiales.wordpress.com/2012/12/13/the-builder-pattern-in-practice/
Muchas gracias Juan Antonio,
Nunca había oido hablar de Lombok. Acabo de montarlo y de probar tus ejemplos y la verdad que además de ahorrar tiempo y código las clases quedan limpias y claras. Mejora muchísimo la lectura del código. Me gusta este proyecto y creo que aportará bastantes mejorías en Java. Todo un estilo a seguir.
Hola buenas tardes, con Eclipse Mars no me está funcionando, sigo los mismos pasos, y googleo un poco y como que es un defecto de la versión. Me podrías ayudar?
Hola Carlos,
Me temo que Eclipse es un poco melindroso con estas cosas, y requiere que hagas un «refresh» del proyecto, e indicarle que debe actualizar las dependencias de maven, y eso lo puedes hacer haciendo click con el botón derecho sobre «maven > update project».
Seguramente sea eso.
Un saludo
[…] para su mapeo en la web http://www.jsonschema2pojo.org/, aunque por su sencillez y haciendo uso de lombok, bastaría con crear una clase declarando las siguientes […]