Implementar funcionalidades comunes en Java con la librería Lombok

Publicado por pico.dev el .
blog-stack java planeta-codigo programacion
Comentarios

Java

Java es un lenguaje verboso además requerir realizar las definiciones de forma explícita y con poco azúcar sintáctico (o como diría algún otro, poco veneno para ratas), esto hace que el número de líneas de código necesarias sea mayor que en otros lenguajes. Que Java sea verboso, explícito y con poco azúcar sintáctico no es necesariamente un inconveniente ya que la mayor parte del tiempo los programadores la dedicamos a leer código ya escrito sin embargo a mayor número de líneas mayor tiempo se requiere en mantenerlas. Un ejemplo claro está en los beans con múltiples propiedades donde por cada propiedad es necesario definir un método get y un método set además implementar de forma correcta los métodos equals y hashCode, el método toString, utilizar el patrón builder, múltiples constructores con combinaciones de propiedades o comprobaciones para valores no nulos en parámetros.

Lombok es una pequeña librería Java que hace posible eliminar todo ese código repetitivo necesario en cada bean o clase Java utilizando varias anotaciones. Usarla no requiere ninguna complicación basta añadirla a la lista de dependencias de compilación y las anotaciones serán procesadas. Los IDEs serán conscientes de los métodos implementados por las anotaciones instalando un complemento.

Las anotaciones proporcionadas por Lombok son las siguientes, en la documentación se explica detalladamente que hace cada una de ellas y un ejemplo de código bastante ilustrativo comparando el código usando las anotaciones y el código Java equivalente:

  • @Getter/@Setter: proporciona una implementación de los métodos get y set.
  • @ToString: proporciona una implementación del método toString generando una cadena con información de las propiedades.
  • @EqualsAndHashCode: proporciona una implementación correcta de los métodos equals y hashCode.
  • @NoArgsConstructor, @RequiredArgsConstructor y @AllArgsConstructor: implementan varios métodos de constructores.
  • @NonNull: valida que un argumento no es nulo lanzando una excepción NullPointerException o IllegalArgumentException en caso de que lo sea.
  • @Data: es una combinación de varias anotaciones, @ToString, @EqualsAndHashCode, @Getter en todos las propiedades y @Setter en todas las propiedades no finales y @RequiredArgsConstructor.
  • @Value: hace una clase inmutable.
  • @Builder: una API para la creación de objetos.
  • @Cleanup: facilita la gestión de recursos de forma automática.
  • @SneakyThrows: posibilita lanzar excepciones sin declararlas en los métodos.
  • @Synchronized: otra forma de implementar la sincronización
  • @Getter(lazy=true): calcula el valor de una propiedad la primera vez que se llama y la cachea.
  • @Log

Usando algunas de estas anotaciones en una clase Java y su uso en un programa.

Usando Gradle hay que añadir en el archivo de construcción del proyecto build.gradle la dependencia en el ámbito de compileOnly.

Usando un IDE, su complemento para Lombok y añadida la dependencia los métodos que implementa Lombok con las anotaciones son visualizados con el asistente de código.

Soporte de Lombok en IntelliJ y ejecución del ejemplo

Las anotaciones de Lombok permiten escribir menos código repetitivo en beans o objetos de transferencia de datos o DTO pero conviene conocer lo que hacen esas anotaciones. Una de las características por las que algunas personas usan otros lenguajes más recientes como Groovy es que en estos requieren menos líneas código para hacer lo mismo que en Java como el caso de los métodos get y set de las propiedades que en Groovy se proporcionan de forma implícita y en Java de forma explícita, con Lombok en Java estos métodos también se pueden proporcionar con anotaciones sin tener que codificarlos.

En el momento de escribir este artículo Lombok no es compatible con Java 9 aunque ya se está trabajando en su soporte y en algún momento lo será.

El código fuente completo del ejemplo puedes descargarlo del repositorio de ejemplos de Blog Bitix alojado en GitHub y probarlo en tu equipo ejecutando el comando ./gradlew run.