To nie jest dokładnie to rozwiązanie do Twojego pytania, ale ja już używać automatycznie wygenerowane metody Eclipse używam Apache commons langEqualsBuilder i HashCodeBuilder:
Tak więc, na przykład możesz zrobić:
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);
}
}
Używa refleksji i nie wymaga zmiany przy dodawaniu pola. Istnieją jednak inne opcje, w których można określić pola, które mają być używane, i jeśli chcemy uwzględnić również kod haszowania superklasy.
EDYCJA: Jak podkreślono, aspekt odbicia może mieć pewne kary za wydajność. Osobiście nie używam odbicia HashCodeBuilder lub EqualsBuilder w kodzie produkcyjnym, używam toHashCode (jak poniżej). Korzystam jednak z ReflectionToStringBuilder do rejestrowania i tym podobnych.
Oto przykład, który nie korzysta z refleksji, ale wymaga, aby dodać kolejną linię gdy dodać pole:
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();
}
Więcej dyskusji na temat hashCodeBuilder patrz apache commons equals/hashcode builder
Uważam, że o wiele ważniejsze jest, aby był poprawny niż generowany automatycznie. Odpowiedź na pytanie Apache HashCode jest drogą do zrobienia. – JohnKlehm