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.