< prev index next >

src/java.base/share/classes/java/io/ObjectStreamField.java

Print this page
rev 17455 : 8184603: Create ObjectStreamField signature lazily when possible
Reviewed-by: rriggs, chegar, alanb, shade

@@ -44,19 +44,19 @@
 {
 
     /** field name */
     private final String name;
     /** canonical JVM signature of field type */
-    private final String signature;
+    private volatile String signature;
     /** field type (Object.class if unknown non-primitive type) */
     private final Class<?> type;
     /** 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
      * be documented with a <code>serialField</code> tag.
      *

@@ -89,12 +89,11 @@
             throw new NullPointerException();
         }
         this.name = name;
         this.type = type;
         this.unshared = unshared;
-        signature = getClassSignature(type).intern();
-        field = null;
+        this.field = null;
     }
 
     /**
      * Creates an ObjectStreamField representing a field with the given name,
      * signature and unshared setting.

@@ -104,11 +103,11 @@
             throw new NullPointerException();
         }
         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;
             case 'B': type = Byte.TYPE; break;
             case 'C': type = Character.TYPE; break;

@@ -240,21 +239,21 @@
      *
      * @return  the typecode of the serializable field
      */
     // REMIND: deprecate?
     public char getTypeCode() {
-        return signature.charAt(0);
+        return getSignature().charAt(0);
     }
 
     /**
      * Return the JVM type signature.
      *
      * @return  null if this field has a primitive type.
      */
     // REMIND: deprecate?
     public String getTypeString() {
-        return isPrimitive() ? null : signature;
+        return isPrimitive() ? null : getSignature();
     }
 
     /**
      * Offset of field within instance data.
      *

@@ -282,11 +281,11 @@
      *
      * @return  true if and only if this field corresponds to a primitive type
      */
     // REMIND: deprecate?
     public boolean isPrimitive() {
-        char tcode = signature.charAt(0);
+        char tcode = getTypeCode();
         return ((tcode != 'L') && (tcode != '['));
     }
 
     /**
      * Returns boolean value indicating whether or not the serializable field

@@ -318,11 +317,11 @@
 
     /**
      * Return a string that describes this field.
      */
     public String toString() {
-        return signature + ' ' + name;
+        return getSignature() + ' ' + name;
     }
 
     /**
      * Returns field represented by this ObjectStreamField, or null if
      * ObjectStreamField is not associated with an actual field.

@@ -334,8 +333,16 @@
     /**
      * Returns JVM type signature of field (similar to getTypeString, except
      * that signature strings are returned for primitive fields as well).
      */
     String getSignature() {
-        return signature;
+        String sig = signature;
+
+        // This lazy calculation is safe since sig 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) {
+            signature = sig = getClassSignature(type).intern();
+        }
+        return sig;
     }
 }
< prev index next >