8184603: Create ObjectStreamField signature lazily when possible
authorredestad
Tue, 18 Jul 2017 12:40:30 +0200
changeset 45892 0b9499e86ee6
parent 45891 55e3ff5a7b08
child 45893 2678b360eecd
8184603: Create ObjectStreamField signature lazily when possible Reviewed-by: rriggs, chegar, alanb, shade
jdk/src/java.base/share/classes/java/io/ObjectStreamField.java
--- a/jdk/src/java.base/share/classes/java/io/ObjectStreamField.java	Mon Jul 17 23:12:15 2017 -0700
+++ b/jdk/src/java.base/share/classes/java/io/ObjectStreamField.java	Tue Jul 18 12:40:30 2017 +0200
@@ -45,16 +45,18 @@
 
     /** field name */
     private final String name;
-    /** canonical JVM signature of field type */
+    /** canonical JVM signature of field type, if given */
     private final String signature;
     /** field type (Object.class if unknown non-primitive type) */
     private final Class<?> type;
+    /** lazily constructed signature for the type, if no explicit signature */
+    private String typeSignature;
     /** whether or not to (de)serialize field values as unshared */
     private final boolean unshared;
     /** corresponding reflective field object, if any */
     private final Field field;
     /** offset of field value in enclosing field group */
-    private int offset = 0;
+    private int offset;
 
     /**
      * Create a Serializable field with the specified type.  This field should
@@ -91,8 +93,8 @@
         this.name = name;
         this.type = type;
         this.unshared = unshared;
-        signature = getClassSignature(type).intern();
-        field = null;
+        this.field = null;
+        this.signature = null;
     }
 
     /**
@@ -106,7 +108,7 @@
         this.name = name;
         this.signature = signature.intern();
         this.unshared = unshared;
-        field = null;
+        this.field = null;
 
         switch (signature.charAt(0)) {
             case 'Z': type = Boolean.TYPE; break;
@@ -242,7 +244,7 @@
      */
     // REMIND: deprecate?
     public char getTypeCode() {
-        return signature.charAt(0);
+        return getSignature().charAt(0);
     }
 
     /**
@@ -252,7 +254,7 @@
      */
     // REMIND: deprecate?
     public String getTypeString() {
-        return isPrimitive() ? null : signature;
+        return isPrimitive() ? null : getSignature();
     }
 
     /**
@@ -284,7 +286,7 @@
      */
     // REMIND: deprecate?
     public boolean isPrimitive() {
-        char tcode = signature.charAt(0);
+        char tcode = getTypeCode();
         return ((tcode != 'L') && (tcode != '['));
     }
 
@@ -320,7 +322,7 @@
      * Return a string that describes this field.
      */
     public String toString() {
-        return signature + ' ' + name;
+        return getSignature() + ' ' + name;
     }
 
     /**
@@ -336,6 +338,17 @@
      * that signature strings are returned for primitive fields as well).
      */
     String getSignature() {
-        return signature;
+        if (signature != null) {
+            return signature;
+        }
+
+        String sig = typeSignature;
+        // This lazy calculation is safe since signature can be null iff one
+        // of the public constructors are used, in which case type is always
+        // initialized to the exact type we want the signature to represent.
+        if (sig == null) {
+            typeSignature = sig = getClassSignature(type).intern();
+        }
+        return sig;
     }
 }