Compute YangInstanceIdentifier.hashCode() lazily
[yangtools.git] / data / yang-data-api / src / main / java / org / opendaylight / yangtools / yang / data / api / StackedYangInstanceIdentifier.java
index c8ff903394400ed140e2e1d8e777ace5e4954c83..b2cc4497da9eb7d41d6be587c1d022706f8a0964 100644 (file)
@@ -23,6 +23,7 @@ import java.security.PrivilegedAction;
 import java.util.ArrayList;
 import java.util.List;
 import org.eclipse.jdt.annotation.NonNull;
+import org.opendaylight.yangtools.util.HashCodeBuilder;
 
 final class StackedYangInstanceIdentifier extends YangInstanceIdentifier implements Cloneable {
     private static final long serialVersionUID = 1L;
@@ -50,9 +51,7 @@ final class StackedYangInstanceIdentifier extends YangInstanceIdentifier impleme
     private transient volatile StackedPathArguments pathArguments;
     private transient volatile StackedReversePathArguments reversePathArguments;
 
-    StackedYangInstanceIdentifier(final YangInstanceIdentifier parent, final PathArgument pathArgument,
-            final int hash) {
-        super(hash);
+    StackedYangInstanceIdentifier(final YangInstanceIdentifier parent, final PathArgument pathArgument) {
         this.parent = requireNonNull(parent);
         this.pathArgument = requireNonNull(pathArgument);
     }
@@ -126,8 +125,7 @@ final class StackedYangInstanceIdentifier extends YangInstanceIdentifier impleme
                 current = stacked.getParent();
             } while (current.tryPathArguments() == null);
 
-            ret = new StackedPathArguments(current, Lists.reverse(stack));
-            pathArguments = ret;
+            pathArguments = ret = new StackedPathArguments(current, Lists.reverse(stack));
         }
 
         return ret;
@@ -164,6 +162,11 @@ final class StackedYangInstanceIdentifier extends YangInstanceIdentifier impleme
         return YangInstanceIdentifier.create(Iterables.skip(getPathArguments(), skipFromRoot));
     }
 
+    @Override
+    int computeHashCode() {
+        return HashCodeBuilder.nextHashCode(parent.hashCode(), pathArgument);
+    }
+
     @Override
     boolean pathArgumentsEqual(final YangInstanceIdentifier other) {
         if (other instanceof StackedYangInstanceIdentifier) {
@@ -191,7 +194,7 @@ final class StackedYangInstanceIdentifier extends YangInstanceIdentifier impleme
         if (parent instanceof FixedYangInstanceIdentifier) {
             p = (FixedYangInstanceIdentifier) parent;
         } else {
-            p = FixedYangInstanceIdentifier.create(parent.getPathArguments(), parent.hashCode());
+            p = FixedYangInstanceIdentifier.of(parent.getPathArguments());
         }
         outputStream.writeObject(p);
     }