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.
Formação Desenvolvedor Java
Conhecer a formaçãoO 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.
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.
Curso Java - Introdução à JPA
Conhecer o cursopackage 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.
O projeto Lombok ainda possui outras anotações que eu não falei neste artigo, recomendo que visitem a documentação do Lombok para ver quais são suas funcionalidades.