Cómo usar la biblioteca Lombok Project en Java

592

En este mini tutorial revisaremos el uso de Lombok Project, biblioteca de código abierto de Java para la reutilización de código repetitivo en POJOs através de anotaciones y también para aumentar sus capacidades.

Puedes revisar la teoría de Lombok a nivel general en la presentación de la charla de Lombok en que di en Guadalajara Java Users Group.

Para ejemplificar el uso de Lombok en Java mostraremos 3 pequeños ejemplos de cómo se ve un POJO sin Lombok, con Lombok y con Lombok inmutable.

Agregar dependencia

Para contar con Lombok en nuestro proyecto agregaremos la dependencia atravéz de Maven o Gradle, en este caso no estamos incluyendo la versión porque al usar Spring Brussels.

<!-- Loombok -->
<dependency>
	    <groupId>org.projectlombok</groupId>
	    <artifactId>lombok</artifactId>
	    <scope>provided</scope>
</dependency>

Una vez agregada la dependencia, ejecuta el jar descargado en la carpeta de Maven y especifica la ruta de instalación de tu IDE (Eclipse, InteliJ o NetBeans) para instalar el plugin de Lombok.

POJO sin Lombok

Para ver las ventajas de Lombok sobre Java plano, veamos cómo se ve un POJO sin el uso de esta biblioteca, al incluir constructor, metodos setters y getters, equals y hashCode y toString.

import org.apache.log4j.Logger;

public class ModelJava {

	private static final Logger log = Logger.getLogger(ModelJava.class);
	
	private String stringValue;
	private Integer integerValue;
	private static final Double doubleValue = calculateDoubleValue();
	
	public ModelJava(String stringValue, Integer integerValue) {
		super();
		this.stringValue = stringValue;
		if(integerValue != null)
			this.integerValue = integerValue;
		else
			throw new NullPointerException("integerValue");
	}

	public String getStringValue() {
		return stringValue;
	}
	public void setStringValue(String stringValue) {
		this.stringValue = stringValue;
	}

	public Integer getIntegerValue() {
		return integerValue;
	}
	public void setIntegerValue(Integer integerValue) {
		if(integerValue != null)
			this.integerValue = integerValue;
		throw new NullPointerException("integerValue");
	}
	
	public Double getDoubleValue() {
		return doubleValue;
	}
	
	private static Double calculateDoubleValue() {
		log.info("Calculating double value");
		double a = 2.0;
		for(int i=0; i<9; i++)
			a = a * 1.5;
		return a;
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((integerValue == null) ? 0 : integerValue.hashCode());
		result = prime * result + ((stringValue == null) ? 0 : stringValue.hashCode());
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		ModelJava other = (ModelJava) obj;
		if (integerValue == null) {
			if (other.integerValue != null)
				return false;
		} else if (!integerValue.equals(other.integerValue))
			return false;
		if (stringValue == null) {
			if (other.stringValue != null)
				return false;
		} else if (!stringValue.equals(other.stringValue))
			return false;
		return true;
	}

	@Override
	public String toString() {
		return "ModelImp [stringValue=" + stringValue + ", integerValue=" + integerValue + "]";
	}	
}

POJO con Lombok

A continuación se muestra el mismo POJO previamente mostrado pero con el uso de Lombok a partir de la anotación @Data, que generarará automáticamente un constructor, setters y getters para cada propiedad y metodos equals, hasCode y toString, nota como optimiza el código haciendolo ver limpio y elegante, también dejándolo mucho más manejable para su modificación y mantenimiento.

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.Getter;
import lombok.NonNull;
import lombok.extern.log4j.Log4j;

@Log4j
@Data
@AllArgsConstructor
public class ModelLombokData {
	
	private String stringValue;
	@NonNull private Integer integerValue;
	@Getter(lazy=true) private static final Double doubleValue = calculateDoubleValue();
	
	private static Double calculateDoubleValue() {
		log.info("Calculating double value");
		double a = 2.0;
		for(int i=0; i<9; i++)
			a = a * 1.5;
		return a;
	}
}

POJO con Lombok (Inmutable)

A continuación se muestra el mismo POJO con el uso de Lombok a partir de la anotación @Value, que generarará automáticamente un constructor, setters y getters para cada propiedad y metodos equals, hasCode y toString. Este POJO además de optimizar código ahora será inmutable.

import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NonNull;
import lombok.Value;
import lombok.extern.log4j.Log4j;

@Log4j
@Value
@AllArgsConstructor
public class ModelLombokValue {
	
	private String stringValue;
	@NonNull private Integer integerValue;
	@Getter(lazy=true) private static final Double doubleValue = calculateDoubleValue();
	
	private static Double calculateDoubleValue() {
		log.info("Calculating double value");
		double a = 2.0;
		for(int i=0; i<9; i++)
			a = a * 1.5;
		return a;
	}
}

Recuerda ejecutar el set de pruebas del proyecto para entender mejor su funcionalidad.


Puedes ver el uso de Project Lombok en un proyecto completo de Java con Spring en el siguiente repositorio de Github: https://github.com/chuucks/SPRING-REST-API

Comments

comments