Lombok Builder com Custom Setter

Lombok Builder com Custom Setter

1. Introdução

Project Lombok é uma biblioteca Java popular para ajudar a reduzir a quantidade de código clichê que um desenvolvedor precisa escrever.

Neste tutorial, veremos como a anotação@Builder do Lombok funciona e como podemos personalizá-la para nossas necessidades específicas.

2. Dependência do Maven

Vamos começar adicionandothe dependency ao nossopom.xml:


    org.projectlombok
    lombok
    1.18.2

3. LombokBuilder Anotação

Antes de começarmos a personalizar a classe de construtor gerada pelo Lombok, vamos fazer uma rápida recapitulação de como a anotação@Builder do Lombok funciona. Já temos umintroduction into Lombok’s features. completo

The @Builder annotation can be used to automatically generate a builder for our class. Para nosso exemplo, usaremos um sistema de mensagens em que um usuário pode enviar uma mensagem para outro usuário. A mensagem é uma string de texto simples ouFile. Usando o Lombok, podemos definir nossa classeMessage da seguinte maneira:

@Builder
@Data
public class Message {
    private String sender;
    private String recipient;
    private String text;
    private File file;
}

@Data gera todo o clichê normalmente associado a um POJO simples (Plain Old Java Object): getters para todos os campos, setters para todos os campos não finais etoString,equals apropriados e implementações dehashCode, e um construtor.

Usando o construtor gerado, agora podemos gerar instâncias de nossa classeMessage:

Message message = Message.builder()
  .sender("[email protected]")
  .recipient("[email protected]")
  .text("How are you today?")
  .build();

A anotação@Builder também suporta valores padrão para atributos, mas não entraremos nisso agora. Deve ficar claro a partir deste exemplo que a anotação@Builder é bastante poderosa e pode substituir muitos códigos clichê.

4. Personalização de Construtores de Lombok

A seção anterior mostrou como podemos usar o Lombok para gerar uma classe de construtor. Mas pode haver casos em que o construtor gerado não é suficiente. Em nosso exemplo, temos uma restrição de que a mensagem possa conter apenas texto ou arquivo. Não pode ter os dois. Lombok não sabe disso, é claro, e o construtor gerado felizmente nos permitirá entrar nesse estado ilegal.

Felizmente, podemos resolver esse problema personalizando o construtor.

A customização de um construtor Lombok é simples e direta:we write the parts of the builder that we want to customize and the Lombok @Builder annotation will simply not generate those parts. Então, no nosso exemplo, isso seria:

public static class MessageBuilder {
    private String text;
    private File file;

    public MessageBuilder text(String text) {
        this.text = text;
        verifyTextOrFile();
        return this;
    }

    public MessageBuilder file(File file) {
        this.file = file;
        verifyTextOrFile();
        return this;
    }

    private void verifyTextOrFile() {
        if (text != null && file != null) {
            throw new IllegalStateException("Cannot send 'text' and 'file'.");
        }
    }
}

Observe que não tivemos que declarar os membrossendererecipient, ou os métodos construtores associados a eles. Lombok ainda irá gerar esses para nós.

Se tentarmos gerar uma instânciaMessage com texto e um arquivo com o seguinte código:

Message message = Message.builder()
  .sender("[email protected]")
  .recipient("[email protected]")
  .text("How are you today?")
  .file(new File("/path/to/file"))
  .build();

Isso resultará na seguinte exceção:

Exception in thread "main" java.lang.IllegalStateException: Cannot send 'text' and 'file'.

5. Conclusão

Neste artigo rápido, vimos como personalizar o construtor Lombok.

Como sempre, o código está disponívelover on GitHub.