Index cached data by method name 89/77889/2
authorRobert Varga <robert.varga@pantheon.tech>
Fri, 16 Nov 2018 07:15:42 +0000 (08:15 +0100)
committerRobert Varga <robert.varga@pantheon.tech>
Fri, 16 Nov 2018 10:57:20 +0000 (11:57 +0100)
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 0cbd8805393998357cbf2d559d46b6bdb0502d3c..e666419f0b89b1e52a5c0754482e4bda7fc69c98 100644 (file)
@@ -43,7 +43,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;
 
@@ -155,7 +155,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) {
@@ -163,7 +166,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;