JP

31 de dez de 20203 min

Introdução ao Lombok

Atualizado: 28 de mar de 2021

O projeto Lombok é uma biblioteca Java que permite criar um código Java utilizando anotações que permitem substituir a criação de getters e setters, métodos equals, builders e entre outros. Para os exemplos a seguir, iremos utilizar como build tool o Maven.

Maven

<dependencies>
 
<dependency>
 
<groupId>org.projectlombok</groupId>
 
<artifactId>lombok</artifactId>
 
<version>1.18.16</version>
 
<scope>provided</scope>
 
</dependency>
 
</dependencies>

Estamos utilizando o escopo do tipo provided que significa que o Lombok será configurado em tempo de compilação.

Vamos criar uma classe chamada Customer e nela iremos criar alguns campos, construtores, métodos getters e setters e um builder. Tudo isso de forma manual. E em seguida vamos recriar esta classe utilizando os recurso do Lombok.

Classe Customer

import java.util.Date;
 

 
public class Customer {
 

 
private Long id;
 
private String firstName;
 
private String lastName;
 
private Date birthDate;
 

 
public Customer(){
 
}
 

 
public Customer(Long id, String firstName,
 
String lastName, Date birthDate){
 
this.id = id;
 
this.firstName = firstName;
 
this.lastName = lastName;
 
this.birthDate = birthDate;
 
}
 

 
public Long getId() {
 
return id;
 
}
 

 
public void setId(Long id) {
 
this.id = id;
 
}
 

 
public String getFirstName() {
 
return firstName;
 
}
 

 
public void setFirstName(String firstName) {
 
this.firstName = firstName;
 
}
 

 
public String getLastName() {
 
return lastName;
 
}
 

 
public void setLastName(String lastName) {
 
this.lastName = lastName;
 
}
 

 
public Date getBirthDate() {
 
return birthDate;
 
}
 

 
public void setBirthDate(Date birthDate) {
 
this.birthDate = birthDate;
 
}
 
}

Entendendo a classe Customer

Na classe Customer criamos:

  1. 4 campos

  2. 2 Construtores, sendo 1 default

  3. métodos getters e setters para cada campo

Perceba que uma quantidade razoável de código foi criado.

Recriando a classe Customer utilizando Lombok

import lombok.AllArgsConstructor;
 
import lombok.Data;
 
import lombok.NoArgsConstructor;
 
import java.util.Date;
 

 
@AllArgsConstructor
 
@NoArgsConstructor
 
@Data
 
public class Customer {
 
private Long id;
 
private String firstName;
 
private String lastName;
 
private Date birthDate;
 
}

Agora perceba a diferença entre o primeiro e este último. Muito mais limpo e elegante.

Entendendo as anotações utilizadas

@AllArgsConstructor

Esta anotação permite substituir a criação de um construtor como por exemplo:

public Customer(Long id, String firstName,
 
String lastName, Date birthDate){
 
this.id = id;
 
this.firstName = firstName;
 
this.lastName = lastName;
 
this.birthDate = birthDate;
 
}

Assim, caso seja necessário adicionar um novo campo, não é necessário declará-lo no construtor. O Lombok faz este trabalho.

@NoArgsConstructor

Já está anotação, substitui o construtor default, ou seja, não te obriga a passar campos como parâmetros no construtor ao criar um novo objeto. Por exemplo:

public Customer(){}

@Data

Esta é uma das anotações mais interessantes. Ela permite a não necessidade da criação do métodos getters e setters, como foi criado no primeiro exemplo de código da classe Customer.


Criando a classe Customer utilizando Builder de forma tradicional

O Builder é um padrão de projeto (padrão de criação) utilizado bastante em código Java para a criação de objetos. No próximo código vamos implementar um builder de forma manual.

import java.util.Date;
 

 
public class Customer {
 

 
private Long id;
 
private String firstName;
 
private String lastName;
 
private Date birthDate;
 

 
private Customer(){}
 

 
public static class Builder {
 

 
private Long id;
 
private String firstName;
 
private String lastName;
 
private Date birthDate;
 

 
public Builder id(Long id){
 
this.id = id;
 
return this;
 
}
 

 
public Builder firstName(String firstName){
 
this.firstName = firstName;
 
return this;
 
}
 

 
public Builder lastName(String lastName){
 
this.lastName = lastName;
 
return this;
 
}
 

 
public Builder birthDate(Date birthDate){
 
this.birthDate = birthDate;
 
return this;
 
}
 

 
public Customer build(){
 
Customer customer = new Customer();
 
customer.id = this.id;
 
customer.firstName = this.firstName;
 
customer.lastName = this.lastName;
 
customer.birthDate = this.birthDate;
 
return customer;
 
}
 
}
 

 
@Override
 
public String toString() {
 
return "id = " + this.id +
 
" FirstName = " + this.firstName +
 
" LastName = " + this.lastName +
 
" BirthDate = " + this.birthDate;
 
}
 
}

Aplicando o Builder na prática

import java.util.Date;
 

 
public class Main {
 

 
public static void main(String[] args) {
 
Customer customer = new Customer
 
.Builder()
 
.id(1L)
 
.firstName("Jones")
 
.lastName("Paul")
 
.birthDate(new Date())
 
.build();
 

 
System.out.println(customer);
 
}
 
}

Resultado

id = 1 FirstName = Jones LastName = Paul BirthDate = Sun Dez 28 11:48:55 BRT 2020

Perceba mais uma vez, um código verboso que poderia ser facilmente substituído pelo Lombok. Agora vamos recriar o código acima utilizando o Lombok.

Recriando a classe Customer utilizando Builder do Lombok

import lombok.Builder;
 
import java.util.Date;
 

 
@Builder
 
public class Customer {
 

 
private Long id;
 
private String firstName;
 
private String lastName;
 
private Date birthDate;
 

 
@Override
 
public String toString() {
 
return "id = " + this.id +
 
" FirstName = " + this.firstName +
 
" LastName = " + this.lastName +
 
" BirthDate = " + this.birthDate;
 
}
 
}

Perceba agora a diferença em termos de quantidade de código escrito. Apenas criamos os mesmos campos, reutilizamos o método toString() e adicionamos a anotação @Builder responsável pela criação e substituição de todo aquele código criado anteriormente no primeiro exemplo.

Aplicando o Builder utilizando Lombok na prática

import java.util.Date;
 

 
public class Main {
 

 
public static void main(String[] args) {
 
Customer customer = Customer
 
.builder()
 
.id(1L)
 
.firstName("Jones")
 
.lastName("Paul")
 
.birthDate(new Date())
 
.build();
 
System.out.println(customer);
 
}
 
}

Perceba que houve uma pequena mudança para executar o código acima. Neste caso não foi preciso criar um objeto utilizando a palavra chave new, apenas invocamos o método builder() e os campos da classe para atribuição.

Resultado

id = 1 FirstName = Jones LastName = Paul BirthDate = Sun Dez 28 11:48:55 BRT 2020

Prático e útil, certo?

É isso, curtiu? Até mais!

    0