Empezar con lombok

De ChuWiki


Qué es lombok[editar]

Lombok es una librería java que al compilar mete automáticamente código en nuestros class. Este código que añade es el código engorroso de hacer a mano, como Getter y Setter, constructores con parámetros, Hashcode y equals, etc. Podemos controlar qué código queremos que se genere y cómo por medio de las anotaciones e lombok.

Veamos algunas de las anotaciones básicas de lombok. Tienes los ejemplos en lombok-example

Anotaciones @Getter y @Setter[editar]

Una de las cosas engorrosas de hacer son los setter y getter de las clases. Con lombok nos bastaría con poner la anotación @Setter y @Getter en la clase para tener métodos setter y getter de todos los atributos

package com.chuidiang.lombok_example;

import lombok.*;

/**
 * @author fjabellan
 * @date 21/11/2020
 */
@Getter
@Setter
public class Data {
    private int anInteger;
    private String anString;
}

Listo, con esto deberíamos tener los métodos set y get de anInteger y anString.

Si no los quremos todos, podemos luego añadir excepciones con anotaciones en los atributos concretos. Por ejemplo, si en el código anterior añadimos la siguiente anotación en el atributo anString

    @Getter(value=AccessLevel.NONE)
    private String anString;

no se generará el getter. Con AccessLevel tenemos además opciones para hacer el getter protegido o privado.

También podemos no poner la anotación Getter y/o Setter en la clase y ponerla en los atributos que nos interesen.

Anotaciones para constructores @AllArgsConstructor y @NoArgsConstructor[editar]

Los constructores que llevan parámetros para meter en los atributos también son bastante repetitivos. Bastaría con poner algo como esto

package com.chuidiang.lombok_example;

import lombok.*;

/**
 * @author fjabellan
 * @date 21/11/2020
 */
@AllArgsConstructor
@NoArgsConstructor
public class Data {
    private int anInteger;
    private String anString;
}

Con la anotación @AllArgsConstructor tenemos disponible un constructor con todos los atributos, en el orden que aparecen. Si queremos mantener un constructor sin parámetros, debemos añadir la anotación @NoArgsConstructor

Tenemos otra anotación posible adicional, @RequiredArgsConstructor. Este analiza los atributos de la clase para ver cuales es obligatorio rellenar en el constructor (por ejemplo, atributos final que no estén inicializados) o que tengan la anotación @NonNull

Anotación @ToString[editar]

Podemos hacer de forma fácil un método toString()

package com.chuidiang.lombok_example;

import lombok.*;

/**
 * @author fjabellan
 * @date 21/11/2020
 */
@ToString
public class Data {
    private int anInteger;
    private String anString;
}

Esto nos da un método toString que saca todos los atributos. En nuestro ejemplo, la salida del método toString() sería

Data(anInteger=10, anString=10)

suponiendo que hubieramos puesto como valores 10 y "10" para el entero y el string respectivamente.

Podemos decidir qué campos queremos en el toString() en la anotación, poniéndola de esta manera

@ToString(of={"anInteger","anString"})

Anotación @EqualsAndHashCode[editar]

El método equals() y hashCode() se pueden hacer también con anotaciones

package com.chuidiang.lombok_example;

import lombok.*;

/**
 * @author fjabellan
 * @date 21/11/2020
 */
@EqualsAndHashCode
public class Data {
    private int anInteger;
    private String anString;
}

esto haría que los métodos equals() y hashCode() tengan en cuenta todos los atributos de la clase para decidir si dos instancias de la clase son iguales o distintas.

De la misma forma que en toString(), podemos decidir qué campos queremos que intervengan en el equals/hashcode.

@EqualsAndHashCode(of={"anInteger"})

Anotación @Data[editar]

Habitualmente una clase puede ser simplemente una estructura de datos y suele ser útil que tenga todo esto: setter, getter, equals y hashcode, constructores y toString. La anotación @Data equivale a todas ellas.

package com.chuidiang.lombok_example;

import lombok.*;

/**
 * @author fjabellan
 * @date 21/11/2020
 */
@Data
public class Data {
    private int anInteger;
    private String anString;
}

Con esto tenemos todo, con las opciones por defecto.

Anotación @Slf4j[editar]

Declarar el logger suele ser también un poco engorroso. En cada clase hay que poner algo del estilo

   private static final Logger log = LoggerFactory.getLogger(Data.class);

Con lombok y en el caso de usar la librería slf4j para logger, se pondría la anotación así

package com.chuidiang.lombok_example;

import lombok.extern.slf4j.Slf4j;

/**
 * @author fjabellan
 * @date 21/11/2020
 */
@Slf4j
public class SomeProcess {
    public void doSomething(){
        log.info("I'm doing something");
    }
}

y tenemos el log disponible sin necesidad de declararlo.