2009-10-11 23 views
12

Al escribir las propias clases, ¿siempre es necesario anular equals(Object o)?¿Deberíamos siempre anular iguales?

Si no lo hago, ¿comprobará automáticamente que todos los campos son los mismos? ¿O simplemente verifica si las dos variables apuntan al mismo objeto?

Respuesta

16

Si uno está escribiendo una clase que va a tener que comparar sus objetos de alguna manera, entonces uno debe anular los métodos equals y hashCode.

Si no se proporciona un método explícito equals resultará en heredar el comportamiento del método equals de la superclase, y en el caso de la superclase siendo la clase Object, entonces será el comportamiento setforth en la Especificación API Java para el Object clase.

El contrato general para proporcionar un método equals se puede encontrar en la documentación de la clase Object, específicamente, la documentación de los métodos equals y hashCode.

4

El método equals para la clase Object implementa la relación de equivalencia más discriminatoria posible en los objetos; es decir, para cualquier valor de referencia no nulo x e y, este método devuelve verdadero si y solo si xey se refieren al mismo objeto (x == y tiene el valor verdadero).

Para probar si dos objetos son iguales en el sentido de equivalencia (que contiene la misma información), debe anular el método equals(). Siempre debe reemplazar el método equals() si el operador de identidad no es apropiado para su clase.

Tenga en cuenta que generalmente es necesario anular el método hashCode siempre que se anule este método, a fin de mantener el contrato general para el método hashCode, que establece que los objetos iguales deben tener códigos hash iguales.

5

Solo reemplaza equals() si tiene sentido. Pero, obviamente, si sobrescribe equals(), debe asegurarse de que el contrato hashcode() no esté roto, lo que significa que si dos objetos son iguales deben tener el mismo código hash.

¿Cuándo tiene sentido? Cuando Object.equals() es insuficiente. Ese método se reduce básicamente a la identidad de referencia, lo que significa dos objetos son el mismo objeto para:

Los números son un ejemplo obvio cuando tiene sentido porque Integer(10) debe ser igual a otra Intger(10).

Otro ejemplo podría ser cuando está representando registros de la base de datos. Supongamos que tiene registros de Estudiante con una ID entera única, entonces podría ser una implementación suficiente de iguales para simplemente comparar los campos de ID.

2

Si bien no debe confiar en un IDE, Eclipse proporciona esta funcionalidad enlatada presionando alt + shift + sy seleccionando las opciones de menú equal y hashCode. También hay una opción toString. Effective Java por Josh Bloch tiene buena información sobre este tema. El enlace lo llevará al capítulo alojado en Google Books que trata este tema.

Cuestiones relacionadas