Uso de la anotación @Builder de Lombok

1. Información general

@Builder de Project Lombok es un mecanismo útil para usar el patrón Builder sin escribir código repetitivo. Podemos aplicar esta anotación a una clase o un método.

En este breve tutorial, veremos los diferentes casos de uso de @Builder .

2. Dependencias de Maven

Primero, necesitamos agregar Project Lombok a nuestro pom.xml :

 org.projectlombok lombok 1.18.10 

Maven Central tiene la última versión de Project Lombok aquí.

3. Usar @Builder en una clase

En el primer caso de uso, simplemente estamos implementando una clase y queremos usar un constructor para crear instancias de nuestra clase.

El primer y único paso es agregar la anotación a la declaración de clase:

@Getter @Builder public class Widget { private final String name; private final int id; } 

Lombok hace todo el trabajo por nosotros. Ahora podemos construir un widget y probarlo:

Widget testWidget = Widget.builder() .name("foo") .id(1) .build(); assertThat(testWidget.getName()) .isEqualTo("foo"); assertThat(testWidget.getId()) .isEqualTo(1);

Si queremos crear copias o casi copias de objetos, podemos agregar la propiedad toBuilder = true a la anotación @Builder :

@Builder(toBuilder = true) public class Widget { //... }

Esto le dice a Lombok que agregue un método toBuilder () a nuestra clase . Cuando invocamos el método toBuilder () , devuelve un constructor inicializado con las propiedades de la instancia en la que se llama:

Widget testWidget = Widget.builder() .name("foo") .id(1) .build(); Widget.WidgetBuilder widgetBuilder = testWidget.toBuilder(); Widget newWidget = widgetBuilder.id(2).build(); assertThat(newWidget.getName()) .isEqualTo("foo"); assertThat(newWidget.getId()) .isEqualTo(2);

Podemos ver en el código de prueba que la clase de constructor generada por Lombok tiene el mismo nombre que nuestra clase, con "Builder" adjunto - WidgetBuilder en este caso. Luego podemos modificar las propiedades que deseamos y construir () una nueva instancia.

Si necesitamos especificar los campos obligatorios, podemos usar la configuración de la anotación para crear un constructor auxiliar:

@Builder(builderMethodName = "internalBuilder") public class RequiredFieldAnnotation { @NonNull private String name; private String description; public static RequiredFieldAnnotationBuilder builder(String name) { return internalBuilder().name(name); } }

En este caso, estamos ocultando el constructor predeterminado como internalBuilder y creando el nuestro. Por lo tanto, cuando creamos el constructor, debemos proporcionar el parámetro requerido:

RequiredField.builder("NameField").description("Field Description").build();

Además, para asegurarnos de que nuestro campo existe, podemos agregar la anotación @NonNull .

4. Usar @Builder en un método

Supongamos que estamos usando un objeto que queremos construir con un constructor, pero no podemos modificar la fuente o extender la Clase .

Primero, creemos un ejemplo rápido usando la anotación @Value de Lombok:

@Value final class ImmutableClient { private int id; private String name; }

Ahora tenemos una clase final con dos miembros inmutables, captadores para ellos y un constructor de todos los argumentos.

Cubrimos cómo usar @Builder en una clase , pero también podemos usarlo en métodos. Usaremos esta capacidad para evitar que no podamos modificar o extender ImmutableClient .

A continuación, crearemos una nueva clase con un método para crear ImmutableClients:

class ClientBuilder { @Builder(builderMethodName = "builder") public static ImmutableClient newClient(int id, String name) { return new ImmutableClient(id, name); } }

Esta anotación crea un método llamado constructor () que devuelve un constructor para crear ImmutableClients .

Ahora, construyamos un ImmutableClient :

ImmutableClient testImmutableClient = ClientBuilder.builder() .name("foo") .id(1) .build(); assertThat(testImmutableClient.getName()) .isEqualTo("foo"); assertThat(testImmutableClient.getId()) .isEqualTo(1);

5. Conclusión

En este artículo, usamos la anotación @Builder de Lombok en un método para crear un constructor para una Clase final , y vimos cómo hacer que algunos de los campos de Clase sean obligatorios.

Los ejemplos de código, como siempre, se pueden encontrar en GitHub.