Questo non è esattamente una soluzione alla tua domanda, ma io uso più i metodi di auto-generate Eclipse, io uso il Apache commons langEqualsBuilder e HashCodeBuilder:
Così, per esempio si può fare:
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);
}
}
Questo usa il riflesso e non ha bisogno di modifiche quando si aggiunge un campo. Tuttavia, esistono altre opzioni in cui è possibile specificare i campi da utilizzare e se si desidera prendere in considerazione anche l'hashCode della superclasse.
MODIFICA: Come è stato sottolineato, l'aspetto di riflessione di questo può avere alcune penalità di prestazioni associate. Personalmente, non uso la riflessione HashCodeBuilder o EqualsBuilder nel codice di produzione, io uso il toHashCode (come sotto). Io comunque uso il ReflectionToStringBuilder per la registrazione e simili.
Ecco un esempio che non fa uso di riflessione, ma si richiede di aggiungere un'altra linea quando si aggiunge 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();
}
Per ulteriori discussione su hashCodeBuilder, vedere apache commons equals/hashcode builder
fonte
2011-10-05 12:20:38
Penso che sia molto più importante averlo corretto rispetto al generato automaticamente. La risposta Apache HashCode è la strada da percorrere. – JohnKlehm