método example equalsandhashcode java equals hashcode

example - Java: Automatic equals() y hashCode()



hashcode y equals en java (5)

La implementación de equals() y hashCode() para datos simples, POJOs está saturando mi código y mantenerlo es tedioso.

¿Cuáles son las bibliotecas que manejan esto automáticamente?
Prefiero la instrumentación de bytecode sobre el enfoque AOP debido a razones de rendimiento.

Actualización: el tema de la necesidad de implementar equals () y hashCode () se ha discutido, aquí está mi punto:

¿No es mejor hacerlo por adelantado con un mínimo esfuerzo en lugar de escribir el código, agregando hC / eq cuando se trata de eso?


Java 7 y posteriores

Si bien no es la panacea que solicitó, escribir el reemplazo de hashCode es un poco más sencillo ahora que en Java 7 y hashCode posteriores.

Objects.hashCode & Objects.hash

A partir de Java 7, la clase Objects ofrece un par de métodos de utilidad para generar valores de código hash.

Ver mi respuesta en una pregunta relacionada para más discusión.

Miembro único, no tolerando un NULL

@Override public int hashCode() { return this.member.hashCode() ; // Throws NullPointerException if member variable is null. }

Miembro único, tolerando un NULL

@Override public int hashCode() { return Objects.hashCode( this.member ) ; // Returns zero (0) if `this.member` is NULL, rather than throwing exception. }

Multi-miembro

@Override public int hashCode() { return Objects.hash( this.memberA , this.memberB , this.memberC ) ; // Hashes the result of all the passed objects’ individual hash codes. }



La biblioteca Apache commons-lang tiene un HashCodeBuilder y EqualsBuilder que hará el trabajo por usted y acortará esos métodos. Incluso hay versiones de reflexión que lo harán todo por usted según los campos en los POJO. Sin embargo, no lo recomendaría. La reflexión puede ser lenta (aunque no tan mala como muchos piensan), y debe implementarlas para asegurarse de que solo se consideren los campos correctos para la igualdad.

Mi pregunta es, ¿realmente necesitas hacer esto? A menudo, el código de hash y los equivalentes en los POJOs solo deben implementarse para su uso con Mapas o Conjuntos. En el caso de Mapas, usualmente usaría una ID para una clave, que no es el propio Pojo. Entonces, ... ¿estás haciendo el trabajo por ti mismo?


Puede usar la biblioteca AutoValue de Google para generar automáticamente clases de valor inmutables con equals y hashCode . Estas clases de valor son algo similares a las clases de casos de Scala o las generadas por Lombok.

También hay una post sobre cómo usarlo en un IDE.


Project Lombok proporciona la anotación @EqualsAndHashCode que generará equals() y hashCode() para sus clases de Java. Por supuesto, hay algunos inconvenientes en comparación con la implementación manual de estos métodos, así que asegúrese de leer la "letra pequeña" en la página vinculada.