2011-08-05 20 views
15

Implementando equals() y hashCode() para datos simples POJOs está saturando mi código y el mantenimiento es tedioso.Java: Equals() automático y hashCode()

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

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

¿No es mejor tener que hacer la derecha por adelantado con el mínimo esfuerzo en lugar de la excavación en el código, agregando hC/eq cuando se trata de eso?

+4

Ninguna biblioteca puede ocuparse de 'iguales' para usted; solo usted sabe qué hace que dos objetos sean iguales. ¿Qué IDE estás usando que no genere 'hashCode' para ti? ¿Y por qué tienes que hacer tanto mantenimiento en 'equals' y' hashCode'? – Paul

+1

Entiendo que en la comunidad Java es común implementar estos métodos para básicamente todos los POJO, pero tengo que preguntar: ¿realmente está utilizando todos sus tipos de POJO como claves en las tablas hash? ¿Los estás comparando por igualdad? Si no, ¿por qué molestarse? –

+0

@Paul - NetBeans, y genera; solo, tengo que volver a generar cada vez, y también hace 10 líneas de código. Además, la lib podría usar la reflexión al generar, entonces, ¿por qué no podría manejar iguales? –

Respuesta

10

Project Lombok proporciona la anotación @EqualsAndHashCode que generará equals() y hashCode() para sus clases de Java. Por supuesto, existen 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.

+0

Eso es probablemente lo que busco. Solo lástima que no esté integrado con NetBeans. –

1

La biblioteca Apache commons-lang tiene un HashCodeBuilder y EqualsBuilder que hará parte del trabajo por usted y acortará esos métodos. Incluso hay versiones de reflexión que lo harán todo por usted en función de 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 implementarla para asegurarse de que solo se consideran los campos correctos para la igualdad.

Mi pregunta es, ¿realmente necesita hacer esto? A menudo, el código hash y el igual en POJOs solo necesitan implementarse para usar con Mapas o Conjuntos. En el caso de Maps, generalmente usaría una identificación para una clave, que no es el propio Pojo. Entonces, ... ¿estás haciendo un trabajo para ti?

+0

+1 para el 2do párrafo, pero ¿no es mejor hacerlo directamente con un mínimo esfuerzo en lugar de cavar en el código, agregando hC/eq cuando se trata de ello? –

+0

Como todo, termina siendo una compensación. Es bueno si está hecho desde el principio, pero implementarlo cuando realmente lo necesito no ha resultado demasiado difícil en mi experiencia. Por supuesto, generalmente tengo pruebas que me dicen cuándo me olvidé de implementarlo. :) – rfeak

2

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

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

+1

Para IntelliJ, consulte https://plus.google.com/+googleguava/posts/i9sRnkDKcdT –

Cuestiones relacionadas