Cómo reducir el código repetitivo con Lombok

4
54248

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

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.

Anotación @Data de Lombok

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.

Lombok, durante el proceso de instalación en nuestro IDE

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.

Lombok con @NoArgsConstructor y @AllArgsConstructor

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.

Patrón Builder implementado por Lombok

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.

Distintas anotaciones para el tratamientos de logs

  • @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

4 COMENTARIOS

  1. 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.

  2. 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?

  3. 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

DEJA UNA RESPUESTA

Por favor ingrese su comentario!

He leído y acepto la política de privacidad

Por favor ingrese su nombre aquí

Información básica acerca de la protección de datos

  • Responsable:
  • Finalidad:
  • Legitimación:
  • Destinatarios:
  • Derechos:
  • Más información: Puedes ampliar información acerca de la protección de datos en el siguiente enlace:política de privacidad