< prev index next >

src/java.base/share/classes/java/lang/invoke/MethodType.java

Print this page
rev 14309 : 8141536: MethodType field offset calculation could be lazy
Reviewed-by: vlivanov, mhaupt

@@ -1168,15 +1168,17 @@
     private void MethodType_init(Class<?> rtype, Class<?>[] ptypes) {
         // In order to communicate these values to readResolve, we must
         // store them into the implementation-specific final fields.
         checkRtype(rtype);
         checkPtypes(ptypes);
-        UNSAFE.putObject(this, rtypeOffset, rtype);
-        UNSAFE.putObject(this, ptypesOffset, ptypes);
+        UNSAFE.putObject(this, OffsetHolder.rtypeOffset, rtype);
+        UNSAFE.putObject(this, OffsetHolder.ptypesOffset, ptypes);
     }
 
-    // Support for resetting final fields while deserializing
+    // Support for resetting final fields while deserializing. Implement Holder
+    // pattern to make the rarely needed offset calculation lazy.
+    private static class OffsetHolder {
     private static final long rtypeOffset, ptypesOffset;
     static {
         try {
             rtypeOffset = UNSAFE.objectFieldOffset
                 (MethodType.class.getDeclaredField("rtype"));

@@ -1184,10 +1186,11 @@
                 (MethodType.class.getDeclaredField("ptypes"));
         } catch (Exception ex) {
             throw new Error(ex);
         }
     }
+    }
 
     /**
      * Resolves and initializes a {@code MethodType} object
      * after serialization.
      * @return the fully initialized {@code MethodType} object
< prev index next >