Java Libs: Introdução ao Lombok
Java sempre foi conhecida como uma linguagem lenta e verborrágica. Apesar de muitas dessas afirmações serem devido ao estigma herdado das primeiras versões da JVM, outras ainda são verdadeiras. Para usuários de outras linguagens como Python ou Ruby, é fato que em Java, tal como em português, muitas vezes se escreve muito para se falar pouco.
Recentemente, diversas APIs e libs estão surgindo para minimizar o esforço de se escrever código Java e tornar a linguagem mais produtiva para o desenvolvedor; Lombok é uma delas.
##O que é Lombok?
Lombok é uma lib disponibilizada no formato de jar, que quando adicionado ao seu classpath, permite o uso de anotações para descrever diversos comportamentos comumente usados na linguagem.
Este tutorial serve como uma rápida introdução à API.
##Mãos à obra
###@NonNull
1
2
3
4
5
public Creature getInstanceOf(@NonNull String name,
@NonNull CreatureType creatureType) {
return new Creature(name, creatureType);
}
}
Como você já deve suspeitar, se o método acima for chamado com name ou creatureType com valor null, ele irá lançar uma NullPointerException.
###@Getter @Setter
Field level
1
2
3
4
5
6
7
8
public class Creature {
@Getter
String name;
@Getter @Setter
CreatureType type;
}
No exemplo acima, @Getter String name cria automaticamente um método public String getName() para a classe Creature.
As linhas @Getter @Setter CreatureType type criam os métodos public CreatureType getType() e public void setType(CreatureType type) para a classe Creature.
Class level
1
2
3
4
5
6
7
@Getter @Setter
public class Creature {
String name;
CreatureType type;
}
As anotações @Getter @Setter presentes na linha 1 geram os seguintes métodos:
- public String getName()
- public void setName(String name)
- public CreatureType getType()
- public void setType(CreatureType type)
###@EqualsAndHashCode
1
2
3
4
5
@EqualsAndHashCode
public class Creature {
String name;
CreatureType type;
}
Esqueça seu gerador de equals e hashcode da sua IDE. A anotação @EqualsAndHashCode gera exatamente esse código para você. Outras opções também são possíveis, como exclusão de atributos.
###@ToString
1
2
3
4
5
@ToString
public class Creature {
String name;
CreatureType type;
}
A anotação @ToString gera o método toString() para o seu objeto. O método retorna uma String no formato ClassName(field1, field2, …, fieldN). No exemplo acima, a seguinte String é retornada: Creature(name, type). Assim como o @EqualsAndHashCode, também é possível excluir atributos.
###@Data
1
2
3
4
5
@Data
public class Creature {
String name;
CreatureType type;
}
Mais conhecida como “adeus java bean verborrágico”, a anotação @Data gera o mesmo efeito que anotar sua classe com @Getter, @Setter, @EqualsAndHashCode e @ToString.
###@AllArgsConstructor
1
2
3
4
5
@AllArgsConstructor
public class Creature {
String name;
CreatureType type;
}
A anotação no exemplo acima gera o seguinte construtor:
1
2
3
4
public Creature(Strine name, CreatureType type) {
this.name = name;
this.type = type;
}
Da mesma forma que as opções anteriores, também é possível excluir atributos do construtor.
###@Slf4j
1
2
3
4
5
6
7
@Slf4j
public class CreatureResource {
public void doGet() {
log.info("Entrei no doGet");
}
}
O código acima não causa um erro de compilação na linha 5. A variável log é criada pela anotação @Slf4j similar à seguinte linha de código:
1
2
private static final org.slf4j.Logger log =
org.slf4j.LoggerFactory.getLogger(CreatureResource.class);
##E ainda tem mais…
As anotações demonstradas aqui possuem diversas configurações possíveis. Além disso, existem inúmeras outras, como por exemplo @Builder, que implementa o Design Pattern de mesmo nome. Não irei me aprofundar muito, pois acredito que o material oficial e este excelente artigo são mais do que suficientes.
##Polêmicas Por fim, não posso deixar de mencionar que inúmeras pessoas são contra o uso de ferramentas como Lombok. Um dos principais argumentos defende que anotações são formas de se construir metadata e não implementar novas funcionalidades através de geração de código. Por exemplo, se você remover a anotação @Slf4j, o código para de compilar, diferente do que aconteceria se você removesse uma anotação @Entity de um bean qualquer.
##Conclusão No meu dia a dia, tenho achado o Lombok uma ferramenta extremamente produtiva, que quando bem usada, ajuda bastante a diminuir o trabalho repetitivo do programador.
Como toda boa ferramenta, deve ser usado sem abuso. Particularmente, eu evito usar @Data, pois não gosto de expor meus sets. Além disso, implementações do equals e do hashcode gerados devem ser validados através de testes unitários para garantir que o comportamento é o esperado pelo desenvolvedor.
Espero que tenham gostado do post e fico aguardando dúvidas e sugestões nos comentários.