• JP

Introdução ao Lombok

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!


Posts recentes

Ver tudo