Java

Projeto Lombok – Acelerando o desenvolvimento Java

Projeto Lombok - Acelerando o desenvolvimento Java - Não é nenhuma novidade que Java é uma linguagem bastante verbosa, isso acontece por diferentes motivos, mas um dos principais motivos é a existencia de código boilerplate.

Projeto Lombok – Acelerando o desenvolvimento Java – Não é nenhuma novidade que Java é uma linguagem bastante verbosa, isso acontece por diferentes motivos, mas um dos principais motivos é a existencia de código boilerplate.

Quantas vezes você já criou uma classe bem simples e no final acabou com um arquivo com mais de cem linhas de código simplesmente por que teve que escrever os métodos contrutores, getters, setters, equals, hashCode e toString? E ainda digo mais, todos esse métodos muito provavelmente foram gerados pela sua IDE.

O cenário descrito acima é bastante comum no desenvolvimento de aplicações Java, pois é um padrão na escrita de código Java conhecida como POJO (Plain Old Java Object), mas só por que é um padrão que não deixa de ser cansativo e bastante chato.

Por conta desse cenário que foi criado o projeto Lombok, projeto esse que irei falar neste artigo.

O que é o Lombok?

O projeto Lombok é uma biblioteca Java que visa a diminuição de código boilerplate e aumento da produtividade no desenvolvimento, ela consegue fazer isso “plugando” código no momento de build do projeto.

Dessa maneira você como pessoa que esta desenvolvendo o projeto não terá mais que ficar escrevendo mêtodos getters e setters, basta apenas adicionar as anotações do Lombok em sua classe que no momento do build o Lombok irá gerar o código necessário e então inclui-lo no arquivo .class gerado.

Instalação do Lombok

Para adicionar o Lombok em um projeto com o Maven é bem simples, basta que adicionemos a dependência do Lombok na lista de dependências do projeto no arquivo pom.xml.

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

Além de adicionarmos a dependência do Lombok no nosso arquivo pom.xml também é necessário instalar o plugin do Lombok em nossa IDE ou Editor de Código Fonte para que o mesmo consiga “enxergar” os mêtodos criados pelo Lombok, esse plugin existe para as principais IDE’s do mercado.

  • Eclipse
  • IntelliJ IDEA
  • Netbeans
  • VS Code

Funcionalidades do Lombok

Como disse anteriormente algo bem comum é criarmos classes no padrão POJO, principalmente quando estamos trabalhando com frameworks como Spring ou JPA/Hibernate. Veja abaixo um simples exemplo de uma classe Cliente no padrão POJO.

package br.com.treinaweb.exemplolombok;

import java.time.LocalDate;

public class Pessoa {

    private String nome;

    private String email;

    private LocalDate dataNascimento;

    public Pessoa() { }

    public Pessoa(String nome, String email, LocalDate dataNascimento) {
        this.nome = nome;
        this.email = email;
        this.dataNascimento = dataNascimento;
    }

    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public LocalDate getDataNascimento() {
        return dataNascimento;
    }

    public void setDataNascimento(LocalDate dataNascimento) {
        this.dataNascimento = dataNascimento;
    }

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((dataNascimento == null) ? 0 : dataNascimento.hashCode());
        result = prime * result + ((email == null) ? 0 : email.hashCode());
        result = prime * result + ((nome == null) ? 0 : nome.hashCode());
        return result;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Pessoa other = (Pessoa) obj;
        if (dataNascimento == null) {
            if (other.dataNascimento != null)
                return false;
        } else if (!dataNascimento.equals(other.dataNascimento))
            return false;
        if (email == null) {
            if (other.email != null)
                return false;
        } else if (!email.equals(other.email))
            return false;
        if (nome == null) {
            if (other.nome != null)
                return false;
        } else if (!nome.equals(other.nome))
            return false;
        return true;
    }

    @Override
    public String toString() {
        return "Pessoa [dataNascimento=" + dataNascimento + ", email=" + email + ", nome=" + nome + "]";
    }

}

Veja que por mais que seja uma classe bem simples que possui apenas três atributos, pelo fato de estarmos utilizando o padrão POJO temos que definir os métodos construtores, getters, setters, hashCode, equals e toString fazendo assim com que o nosso arquivo tenha um total de 88 linhas de código.

Agora veja como o Lombok pode tornar essa classe bem menos verbosa, vamos utilizar o Lombok para definir os métodos getter e setter dos atributos dessa classe.

package br.com.treinaweb.exemplolombok;

import java.time.LocalDate;

import lombok.Getter;
import lombok.Setter;

public class Pessoa {

    @Getter
    @Setter
    private String nome;

    @Getter
    @Setter
    private String email;

    @Getter
    @Setter
    private LocalDate dataNascimento;

    public Pessoa() { }

    public Pessoa(String nome, String email, LocalDate dataNascimento) {
        this.nome = nome;
        this.email = email;
        this.dataNascimento = dataNascimento;
    }

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((dataNascimento == null) ? 0 : dataNascimento.hashCode());
        result = prime * result + ((email == null) ? 0 : email.hashCode());
        result = prime * result + ((nome == null) ? 0 : nome.hashCode());
        return result;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Pessoa other = (Pessoa) obj;
        if (dataNascimento == null) {
            if (other.dataNascimento != null)
                return false;
        } else if (!dataNascimento.equals(other.dataNascimento))
            return false;
        if (email == null) {
            if (other.email != null)
                return false;
        } else if (!email.equals(other.email))
            return false;
        if (nome == null) {
            if (other.nome != null)
                return false;
        } else if (!nome.equals(other.nome))
            return false;
        return true;
    }

    @Override
    public String toString() {
        return "Pessoa [dataNascimento=" + dataNascimento + ", email=" + email + ", nome=" + nome + "]";
    }

}

Podemos utilizar as anotações @Getter e @Setter nos atributos da classe para que o Lombok gere esses métodos no processo de build do projeto, podemos melhorar esse código ainda mais adicionando as anotações @Getter e @Setter na classe e não nos atributos, assim o Lombok irá gerar métodos getter e setter para todos os atributos da classe.

Além dos métodos getter e setter, podemos fazer com o que o Lombok gere os métodos contrutores, com as anotações @AllArgsConstructor e @NoArgsConstructor.

package br.com.treinaweb.exemplolombok;

import java.time.LocalDate;

import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
public class Pessoa {

    private String nome;

    private String email;

    private LocalDate dataNascimento;

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((dataNascimento == null) ? 0 : dataNascimento.hashCode());
        result = prime * result + ((email == null) ? 0 : email.hashCode());
        result = prime * result + ((nome == null) ? 0 : nome.hashCode());
        return result;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Pessoa other = (Pessoa) obj;
        if (dataNascimento == null) {
            if (other.dataNascimento != null)
                return false;
        } else if (!dataNascimento.equals(other.dataNascimento))
            return false;
        if (email == null) {
            if (other.email != null)
                return false;
        } else if (!email.equals(other.email))
            return false;
        if (nome == null) {
            if (other.nome != null)
                return false;
        } else if (!nome.equals(other.nome))
            return false;
        return true;
    }

    @Override
    public String toString() {
        return "Pessoa [dataNascimento=" + dataNascimento + ", email=" + email + ", nome=" + nome + "]";
    }

}

E para finalizar podemos utilizar as anotações @EqualsAndHashCode para gerar os métodos equals e hashCode e também podemos utilizar a anotação @ToString para gerar o método toString.

package br.com.treinaweb.exemplolombok;

import java.time.LocalDate;

import lombok.AllArgsConstructor;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;

@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
@EqualsAndHashCode
@ToString
public class Pessoa {

    private String nome;

    private String email;

    private LocalDate dataNascimento;

}

Veja como a nossa classe ficou bem menor, dessa maneira não temos arquivos com centenas de linhas de código que não tem nenhum significado para as regras de négocio de nossa aplicação.

O Lombok ainda disponibiliza a anotação @Data que é a junção das anotações @Getter@Setter@EqualsAndHashCode e @ToString.

package br.com.treinaweb.exemplolombok;

import java.time.LocalDate;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Pessoa {

    private String nome;

    private String email;

    private LocalDate dataNascimento;

}

E esse é o resultado final de nossa classe utilizando as anotações do Lombok para evitar o uso de código boilerplate.

Conclusão

Vimos nesse artigo que o projeto Lombok pode nos ajudar bastante no desenvolvimento de nossos projetos com Java, pois o mesmo evita que tenhamos que criar código boilerplate em nossas classes, fazendo com que tenhamos arquivos menores e consequentemente mais fáceis de dar manutenção.