Это не совсем решение вашего вопроса, но я больше не использую автоматически сгенерированные методы Eclipse, я использую Apache commons lang EqualsBuilder и HashCodeBuilder
Так, например, вы можете сделать:
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);
}
}
Использует отражение и не нуждается в изменении при добавлении поля. Однако есть и другие варианты, в которых вы можете указать поля для использования, а также, если вы хотите учесть hashCode суперкласса.
РЕДАКТИРОВАТЬ: Как было указано, аспект отражения может иметь некоторые потери производительности. Лично я не использую отражения HashCodeBuilder или EqualsBuilder в производственном коде, я использую toHashCode (как показано ниже). Однако я использую ReflectionToStringBuilder для регистрации и тому подобное.
Вот пример, в котором не используется отражение, но требуется добавить еще одну строку при добавлении поля:
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();
}
Подробнее о hashCodeBuilder см. apache commons equals / hashcode builder