public class HashCodeBuilder extends Object
Assists in implementing Object.hashCode() methods.
This class enables a good hashCode method to be built for any class. It
follows the rules laid out in the book
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 smoker;
...
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
appendSuper(int).
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);
}
| Constructor and Description |
|---|
HashCodeBuilder()
Uses two hard coded choices for the constants needed to build a
hashCode
. |
HashCodeBuilder(int initialNonZeroOddNumber,
int multiplierNonZeroOddNumber)
Two randomly chosen, non-zero, odd numbers must be passed in.
|
| Modifier and Type | Method and Description |
|---|---|
HashCodeBuilder |
append(boolean value)
Append a
hashCode for a boolean. |
HashCodeBuilder |
append(boolean[] array)
Append a
hashCode for a boolean array. |
HashCodeBuilder |
append(byte value)
Append a
hashCode for a byte. |
HashCodeBuilder |
append(byte[] array)
Append a
hashCode for a byte array. |
HashCodeBuilder |
append(char value)
Append a
hashCode for a char. |
HashCodeBuilder |
append(char[] array)
Append a
hashCode for a char array. |
HashCodeBuilder |
append(double value)
Append a
hashCode for a double. |
HashCodeBuilder |
append(double[] array)
Append a
hashCode for a double array. |
HashCodeBuilder |
append(float value)
Append a
hashCode for a float. |
HashCodeBuilder |
append(float[] array)
Append a
hashCode for a float array. |
HashCodeBuilder |
append(int value)
Append a
hashCode for an int. |
HashCodeBuilder |
append(int[] array)
Append a
hashCode for an int array. |
HashCodeBuilder |
append(long value)
Append a
hashCode for a long. |
HashCodeBuilder |
append(long[] array)
Append a
hashCode for a long array. |
HashCodeBuilder |
append(Object object)
Append a
hashCode for an Object. |
HashCodeBuilder |
append(Object[] array)
Append a
hashCode for an Object array. |
HashCodeBuilder |
append(short value)
Append a
hashCode for a short. |
HashCodeBuilder |
append(short[] array)
Append a
hashCode for a short array. |
HashCodeBuilder |
appendSuper(int superHashCode)
Adds the result of super.hashCode() to this builder.
|
Integer |
build()
Returns the computed
hashCode. |
int |
hashCode()
The computed
hashCode from toHashCode() is returned due to the
likelyhood of bugs in mis-calling toHashCode() and the unlikelyness of it mattering
what the hashCode for HashCodeBuilder itself is. |
int |
toHashCode()
Return the computed
hashCode. |
public HashCodeBuilder()
Uses two hard coded choices for the constants needed to build a hashCode
.
public HashCodeBuilder(int initialNonZeroOddNumber,
int multiplierNonZeroOddNumber)
Two randomly chosen, non-zero, odd numbers must be passed in. Ideally these should be different for each class, however this is not vital.
Prime numbers are preferred, especially for the multiplier.
initialNonZeroOddNumber - a non-zero, odd number used as the initial valuemultiplierNonZeroOddNumber - a non-zero, odd number used as the multiplierIllegalArgumentException - if the number is zero or evenpublic HashCodeBuilder append(boolean value)
Append a hashCode for a boolean.
This adds iConstant * 1 to the hashCode and not a
1231 or 1237 as done in java.lang.Boolean.
value - the boolean to add to the hashCodepublic HashCodeBuilder append(boolean[] array)
Append a hashCode for a boolean array.
array - the array to add to the hashCodepublic HashCodeBuilder append(byte value)
Append a hashCode for a byte.
value - the byte to add to the hashCodepublic HashCodeBuilder append(byte[] array)
Append a hashCode for a byte array.
array - the array to add to the hashCodepublic HashCodeBuilder append(char value)
Append a hashCode for a char.
value - the char to add to the hashCodepublic HashCodeBuilder append(char[] array)
Append a hashCode for a char array.
array - the array to add to the hashCodepublic HashCodeBuilder append(double value)
Append a hashCode for a double.
value - the double to add to the hashCodepublic HashCodeBuilder append(double[] array)
Append a hashCode for a double array.
array - the array to add to the hashCodepublic HashCodeBuilder append(float value)
Append a hashCode for a float.
value - the float to add to the hashCodepublic HashCodeBuilder append(float[] array)
Append a hashCode for a float array.
array - the array to add to the hashCodepublic HashCodeBuilder append(int value)
Append a hashCode for an int.
value - the int to add to the hashCodepublic HashCodeBuilder append(int[] array)
Append a hashCode for an int array.
array - the array to add to the hashCodepublic HashCodeBuilder append(long value)
Append a hashCode for a long.
value - the long to add to the hashCodepublic HashCodeBuilder append(long[] array)
Append a hashCode for a long array.
array - the array to add to the hashCodepublic HashCodeBuilder append(Object object)
Append a hashCode for an Object.
object - the Object to add to the hashCodepublic HashCodeBuilder append(Object[] array)
Append a hashCode for an Object array.
array - the array to add to the hashCodepublic HashCodeBuilder append(short value)
Append a hashCode for a short.
value - the short to add to the hashCodepublic HashCodeBuilder append(short[] array)
Append a hashCode for a short array.
array - the array to add to the hashCodepublic HashCodeBuilder appendSuper(int superHashCode)
Adds the result of super.hashCode() to this builder.
superHashCode - the result of calling super.hashCode()public int toHashCode()
Return the computed hashCode.
hashCode based on the fields appendedpublic Integer build()
hashCode.hashCode based on the fields appendedpublic int hashCode()
The computed hashCode from toHashCode() is returned due to the
likelyhood of bugs in mis-calling toHashCode() and the unlikelyness of it mattering
what the hashCode for HashCodeBuilder itself is.
Processing Library proscene by Jean Pierre Charalambos. (c) 2014-2017 National University of Colombia