2011-10-18 11 views
6

Si sólo algunos de los campos de un objeto representa el estado real, supongo que estos podrían ser ignorados cuando anulando equals y hashCode ...Posibles peligros al ignorar algunos campos en equals/hashCode?

puedo obtener una sensación de inquietud acerca de esto, sin embargo, y quería preguntar,

  1. ¿Es esta práctica común?
  2. ¿Hay algún riesgo potencial con este enfoque?
  3. ¿Hay alguna documentación o directrices a la hora de ignorar algunos campos en equals/hashCode?

En mi situación particular, estoy explorando un espacio de estado de un problema. Me gustaría mantener un conjunto de hash de estados visitados, pero también estoy considerando incluir la ruta que lleva al estado. Obviamente, dos estados son iguales, a pesar de que se encuentran por caminos diferentes.

Respuesta

3

Esto se basa en cómo consideraría la singularidad de un objeto dado. Si tiene una clave principal (clave única), usar ese atributo solo es suficiente.

Si cree que la singularidad es la combinación de 10 atributos diferentes, utilice los 10 atributos en los equivalentes.

Luego use solo los atributos que utilizó en iguales para generar el código hash porque los mismos objetos deberían generar los mismos códigos hash.

Al seleccionar el (los) atributo (s) para iguales y código hash es cómo se define la singularidad de un objeto dado.

  • ¿Es esta la práctica habitual? Sí

  • ¿Hay algún riesgo potencial con este enfoque? No

  • ¿Hay alguna documentación o directrices a la hora de ignorar algunos campos en iguales/hashCode?

    "El método igual para la clase Objeto implementa la relación de equivalencia más discriminativa en los objetos;"

Esto es de Javadoc clase de objeto. Pero como autor de la clase, usted sabe cómo se define la singularidad.

+0

Como ha mencionado, NO incluye la "ruta" en sus iguales o hashCode() –

+0

Me gusta esta respuesta, pero evita un poco mis tres preguntas :-) – aioobe

+0

respondió a sus preguntas. –

2

En última instancia, "igual" significa lo que quiere decir. Existe la restricción de que los valores "iguales" deben devolver el mismo código hash, y, por supuesto, si se presentan con dos direcciones idénticas "iguales", debe devolver verdadero. Pero podría, por ejemplo, tener un "igual" que comparó el contenido de dos páginas web (ignorando el problema de la repetibilidad para el nonce), y, aunque las URL eran diferentes, dijo "igual" si el contenido de la página coincidía en algunos camino.

0

La mejor documentación/directrices que he visto para anular los métodos en Object estaba en Josh Bloch's Effective Java. Tiene un capítulo completo sobre "Métodos comunes a todos los objetos" que incluye secciones sobre "Obedecer el contrato general cuando se reemplaza por iguales" y "Anular siempre el código hash cuando anula iguales". Describe, en detalle, las cosas que debe considerar al anular estos dos métodos. No daré la respuesta directamente; el libro definitivamente vale la pena el costo para cada desarrollador de Java.

Cuestiones relacionadas