Algumas coisas pedem por soluções automáticas. Entre os candidatos para a automação estão tarefas repetitivas, com regras e condições bem definidas e sujeitas a erros. Exatamente o caso dos métodos hashCode, equals, compateTo e toString.Enquanto trabalhava com dúzias de entidades (JPA entity beans), a necessidade de geração automática para os método citados ficou ainda mais evidente, por isso comecei a procurar na Net por plugins para esse fim. E achei (thank god!) o NISECommons4E4N. Para utilizá-lo, baixe o arquivo .nbm e instale o plugin no NetBeans. Se precisar de ajuda, veja Nota - nbextras.org.A classe Contato será utilizada como exemplo para a geração automática dos métodos equals, hashCode, toString e compareTo.@Entitypublic class
Contato implements Serializable {.....@Id private Long id;.....private String email;.....private String
nomePrimeiro;.....private String nomeUltimo;.....private String celular;.....public Contato()
{.....}...... . . // Acessores e modificadores omitidos por brevidade.}equals(Object other) e hashCode()No código fonte, selecione NISECommons4E4N Lang -> Generate Equals and
HashCode... Selecione os campos que devem fazer parte dos métodos equals() e hashCode(), o ponto de inserção para esses métodos - primeiro método na classe, último método, etc. - e demais opções.Os métodos equals() e hashCode() resultantes para a entidade Contato serão como abaixo:@Entitypublic class Contato implements Serializable {...... .
......@Override.....public boolean equals(final Object other) {..........if (this == other)...............return true;..........if (!(other instanceof Contato))...............return false;..........Contato castOther = (Contato)
other;..........return new EqualsBuilder().....................append(id,
castOther.id).....................append(email, castOther.email).....................append(nomePrimeiro, castOther.nomePrimeiro).....................append(nomeUltimo, castOther.nomeUltimo).....................append(celular, castOther.celular).....................isEquals();.....}.....@Override.....public int hashCode() {..........return new HashCodeBuilder().....................append(id).....................append(email).....................append(nomePrimeiro).....................append(nomeUltimo).....................append(celular).....................toHashCode();.....}...... . .}toString()No código fonte, selecione NISECommons4E4N Lang -> Generate ToString Method... Selecione os campos que devem fazer parte do método toString(), seu ponto de inserção e outras opções.Segue a implementação de toString() para Contato:@Entity public class Contato implements Serializable {...... . ......@Override.....public String toString() {..........return new
ToStringBuilder(this, ToStringStyle.DEFAULT_STYLE).....................append("id", id).....................append("email", email).....................append("nomePrimeiro", nomePrimeiro).....................append("nomeUltimo", nomeUltimo).....................append("celular", celular).....................toString();.....}...... . .}compareTo(Object other)Selecione NISECommons4E4N Lang ->
Generate CompareTo Method... Selecione os campos que devem fazer parte do método compareTo(), o ponto de inserção e demais opções.O resultado será:public class Contato implements Serializable, Comparable
other.nomeUltimo).....................append(celular, other.celular).....................toComparison();..........}...... . .}Mas Afinal do que se Trata EqualsBuilder, HashCodeBuilder, ToStringBuilder e CompareToBuilder ?São classes da biblioteca Commons Lang do Projeto
Jakarta.A premissa do Commons Lang é que a Java API (biblioteca de classes presentes em todos os ambientes de produção Java) tem uma lacuna de métodos para manipulação de suas principais classes. De acordo com o sítio do projeto: The
Lang Component provides a host of helper utilities for the java.lang API, notably String manipulation methods, basic numerical methods, object reflection, creation and serialization, and System properties. Additionally it contains an inheritable enum type, an exception structure that supports multiple types of nested-Exceptions, basic enhancements to java.util.Date and a series of utlities dedicated to help with building methods, such as hashCode, toString and
equals.O fato do plugin NISECommons4E4N se apoiar na Commons Lang pode ser uma desvantagem quando existir o objetivo de evitar ao máximo bibliotecas de terceiros.Mas a Commons Lang é uma ótima pedida e uma excelente biblioteca. No geral, sobrescrever métodos da classe Object pode ocasionar muitos bugs, a maioria de difícil detecção (vejam o artigo How to avoid traps and correctly override methods from java.lang.Object). A classe EqualsBuilder, por exemplo, segue as regras do Effective Java , de Joshua
Bloch.Veja Também:Adicionando uma Biblioteca ao Classpath do AplicativoStripwhitespace Module - Elimine Espaços Desnecessários no Seu
Código-FonteFindBugs in ActionPMD in ActionJPA - Java Persistence APIFontes Utilizadas:equals() and hashCode() Generation Plugins for EclipseA little Java UserCommonsLang org.apache.commons.lang.builder.EqualsBuilder