Esto no es exactamente una solución a su pregunta, pero ya no utilizan los métodos generados automáticamente Eclipse, yo uso el Apache commons langEqualsBuilder y HashCodeBuilder:
Así, por ejemplo, usted puede hacer:
import org.apache.commons.lang3.builder.EqualsBuilder;
import org.apache.commons.lang3.builder.HashCodeBuilder;
import org.apache.commons.lang3.builder.ReflectionToStringBuilder;
public class EqualsTest {
private String foo;
private int bar;
// getters and setters
@Override
public String toString() {
return ReflectionToStringBuilder.toString(this);
}
@Override
public int hashCode() {
return HashCodeBuilder.reflectionHashCode(this);
}
@Override
public boolean equals(Object obj) {
return EqualsBuilder.reflectionEquals(this, obj);
}
}
Esto utiliza la reflexión, y no necesita cambiar cuando agrega un campo. Sin embargo, hay otras opciones en las que puede especificar los campos que se usarán y si también desea tener en cuenta el hashCode de la superclase.
EDITAR: Como se ha señalado, el aspecto de reflexión de esto puede tener algunas penalizaciones de rendimiento asociadas. Personalmente, no uso el reflejo HashCodeBuilder o EqualsBuilder en el código de producción, utilizo el toHashCode (como se muestra a continuación). Sin embargo, utilizo ReflectionToStringBuilder para el registro y cosas por el estilo.
Este es un ejemplo que no utiliza la reflexión, pero se requiere añadir otra línea cuando se agrega un campo:
public int hashCode() {
// you pick a hard-coded, randomly chosen, non-zero, odd number
// ideally different for each class
return new HashCodeBuilder(17, 37).
append(foo).
append(bar).
toHashCode();
}
Para mayor discusión sobre hashCodeBuilder, ver apache commons equals/hashcode builder
Creo que es mucho más importante tenerlo correcto que generado automáticamente. La respuesta de Apache HashCode es el camino a seguir. – JohnKlehm