sun.com/docs/books/effective/index.html">Effective Java by Joshua Bloch. Writing a good
hashCode
method is actually quite difficult. This class aims to simplify the process.
All relevant fields from the object should be included in the hashCode
method. Derived fields may be excluded. In general, any field used in the equals
method must be used in the hashCode
method.
To use this class write code as follows:
public class Person { String name; int age; boolean isSmoker; ... 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(name). append(age). append(smoker). toHashCode(); } }
If required, the superclass hashCode()
can be added using {@link #appendSuper}.
Alternatively, there is a method that uses reflection to determine the fields to test. Because these fields are usually private, the method, reflectionHashCode
, uses AccessibleObject.setAccessible
to change the visibility of the fields. This will fail under a security manager, unless the appropriate permissions are set up correctly. It is also slower than testing explicitly.
A typical invocation for this method would look like:
public int hashCode() { return HashCodeBuilder.reflectionHashCode(this); }
@author Stephen Colebourne
@author Gary Gregory
@author Pete Gieser
@since 1.0
@version $Id: HashCodeBuilder.java 161243 2005-04-14 04:30:28Z ggregory $