Decouple HashCodeBuilder from Builder
[yangtools.git] / common / util / src / main / java / org / opendaylight / yangtools / util / HashCodeBuilder.java
index 874809f13c77e74dba17f1fa21ed9e1877ef64d1..650c00e15043ee43a99709bec8047c30bddd77d4 100644 (file)
@@ -7,20 +7,27 @@
  */
 package org.opendaylight.yangtools.util;
 
-import org.opendaylight.yangtools.concepts.Builder;
-
 /**
- * Utility class for incrementally building object hashCode by hashing together
- * component objects, one by one.
+ * Utility class for incrementally building object hashCode by hashing together component objects, one by one.
  *
- * @param <T> Component objec type
+ * @param <T> Component object type
  */
-public final class HashCodeBuilder<T> implements Builder<Integer> {
+public final class HashCodeBuilder<T> {
+    /**
+     * The value 31 was chosen because it is an odd prime. If it were even and the multiplication overflowed,
+     * information would be lost, as multiplication by 2 is equivalent to shifting. The advantage of using a prime is
+     * less clear, but it is traditional. A nice property of 31 is that the multiplication can be replaced by a shift
+     * and a subtraction for better performance: 31 * i == (i << 5) - i. Modern VMs do this sort of optimization
+     * automatically.
+     *
+     * <p>(from Joshua Bloch's Effective Java, Chapter 3, Item 9: Always override hashcode when you override equals,
+     * page 48)
+     */
+    private static final int PRIME = 31;
     private int currentHash;
 
     /**
-     * Create a new instance, with internal hash initialized to 1,
-     * equivalent of {@link #HashCodeBuilder(1)}.
+     * Create a new instance, with internal hash initialized to 1, equivalent of <code>HashCodeBuilder(1)</code>.
      */
     public HashCodeBuilder() {
         this(1);
@@ -36,20 +43,18 @@ public final class HashCodeBuilder<T> implements Builder<Integer> {
     }
 
     /**
-     * Determine the next hash code combining a base hash code and the
-     * hash code of an object.
+     * Determine the next hash code combining a base hash code and the hash code of an object.
      *
      * @param hashCode base hash code
      * @param obj Object to be added
      * @return Combined hash code
      */
     public static int nextHashCode(final int hashCode, final Object obj) {
-        return 31 * hashCode + obj.hashCode();
+        return PRIME * hashCode + obj.hashCode();
     }
 
     /**
-     * Update the internal hash code with the hash code of a component
-     * object.
+     * Update the internal hash code with the hash code of a component object.
      *
      * @param obj Component object
      */
@@ -57,8 +62,12 @@ public final class HashCodeBuilder<T> implements Builder<Integer> {
         currentHash = nextHashCode(currentHash, obj);
     }
 
-    @Override
-    public Integer toInstance() {
+    /**
+     * Return the currently-accumulated hash code.
+     *
+     * @return Current hash code
+     */
+    public int build() {
         return currentHash;
     }
 }