Index cached data by method name 84/77884/3
authorRobert Varga <robert.varga@pantheon.tech>
Fri, 16 Nov 2018 07:15:42 +0000 (08:15 +0100)
committerRobert Varga <nite@hq.sk>
Wed, 21 Nov 2018 11:10:19 +0000 (11:10 +0000)
Method.hashCode() is not a constant, whereas String.hashCode() is
pre-computed (for interned Strings). As Method.getName() is guaranteed
to be interned and getters have zero arguments, a method's name
is enough to uniquely identify the corresponding piece of data.

Therefore use Method.getName() to index cachedData.

Change-Id: Ie9fec477bd7346042e3700695588bc526fd56dac
JIRA: MDSAL-398
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
(cherry picked from commit 5a4700262acd57d7ff878a0d690109e80de6f537)

binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/LazyDataObject.java

index 7c7d74c9ed6cb2ea2a9d0bbbddaa4a9749dbd454..988dbcc7b97fd979f6e04c73fef753b14471008c 100644 (file)
@@ -44,7 +44,7 @@ class LazyDataObject<D extends DataObject> implements InvocationHandler, Augment
     private static final String AUGMENTATIONS = "augmentations";
     private static final Object NULL_VALUE = new Object();
 
-    private final ConcurrentHashMap<Method, Object> cachedData = new ConcurrentHashMap<>();
+    private final ConcurrentHashMap<String, Object> cachedData = new ConcurrentHashMap<>();
     private final NormalizedNodeContainer<?, PathArgument, NormalizedNode<?, ?>> data;
     private final DataObjectCodecContext<D,?> context;
 
@@ -160,7 +160,10 @@ class LazyDataObject<D extends DataObject> implements InvocationHandler, Augment
     }
 
     private Object getBindingData(final Method method) {
-        Object cached = cachedData.get(method);
+        // Guaranteed to be interned and since method has zero arguments, name is sufficient to identify the data,
+        // skipping Method.hashCode() computation.
+        final String methodName = method.getName();
+        Object cached = cachedData.get(methodName);
         if (cached == null) {
             final Object readedValue = context.getBindingChildValue(method, data);
             if (readedValue == null) {
@@ -168,7 +171,7 @@ class LazyDataObject<D extends DataObject> implements InvocationHandler, Augment
             } else {
                 cached = readedValue;
             }
-            cachedData.putIfAbsent(method, cached);
+            cachedData.putIfAbsent(methodName, cached);
         }
 
         return cached == NULL_VALUE ? null : cached;