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.