Cache constructor in NxMatchInfoHelper 58/92758/6
authorRobert Varga <robert.varga@pantheon.tech>
Tue, 29 Sep 2020 06:41:37 +0000 (08:41 +0200)
committerChetan Arakere Gowdru <chetan.arakere@altencalsoftlabs.com>
Tue, 27 Oct 2020 01:45:17 +0000 (01:45 +0000)
Constructor is an invariant, make sure we cache it for reuse,
speeding up instantiation and catching mismatched classes
earlier.

Change-Id: Idc464ff9b572e859fd5c64c594a215cef48cb14f
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
mdsalutil/mdsalutil-api/src/main/java/org/opendaylight/genius/mdsalutil/nxmatches/NxMatchInfoHelper.java

index cd809ce895f0b5a37b9e9fe3253d0c500c57bcb6..138ea0ef11b8e8f3e032a7f3105d5c647279dd44 100644 (file)
@@ -7,6 +7,7 @@
  */
 package org.opendaylight.genius.mdsalutil.nxmatches;
 
+import java.lang.reflect.Constructor;
 import java.util.HashMap;
 import java.util.Map;
 import org.opendaylight.genius.mdsalutil.NxMatchInfo;
@@ -32,17 +33,23 @@ public abstract class NxMatchInfoHelper<T extends DataObject, B extends Builder<
     private final Class<B> builderClass;
     // The key class can't be a type parameter, it varies in some subclasses
     private final Class<? extends ExtensionKey> keyClass;
+    private final Constructor<B> ctor;
 
     protected NxMatchInfoHelper(Class<? extends ExtensionKey> keyClass) {
         this.keyClass = keyClass;
         builderClass = SuperTypeUtil.getTypeParameter(getClass(), 1);
+        try {
+            ctor = builderClass.getDeclaredConstructor();
+        } catch (NoSuchMethodException e) {
+            throw new IllegalStateException(builderClass + " does not define a no-arg constructor", e);
+        }
     }
 
     @Override
     public void createInnerMatchBuilder(Map<Class<?>, Object> mapMatchBuilder) {
         populateBuilder((B) mapMatchBuilder.computeIfAbsent(builderClass, key -> {
             try {
-                return builderClass.getDeclaredConstructor().newInstance();
+                return ctor.newInstance();
             } catch (ReflectiveOperationException e) {
                 throw new IllegalStateException("Unable to create an instance of " + builderClass, e);
             }