# HG changeset patch # User redestad # Date 1500033030 -7200 # Fri Jul 14 13:50:30 2017 +0200 # Node ID 64e55fef647fcd1afd686a270939611bc90ca69d # Parent 7bdb59123fe516a4a9170a43581047390c52e372 8184603: Create ObjectStreamField signature lazily when possible Reviewed-by: rriggs diff --git a/src/java.base/share/classes/java/io/ObjectStreamField.java b/src/java.base/share/classes/java/io/ObjectStreamField.java --- a/src/java.base/share/classes/java/io/ObjectStreamField.java +++ b/src/java.base/share/classes/java/io/ObjectStreamField.java @@ -46,7 +46,7 @@ /** 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 */ @@ -91,7 +91,7 @@ this.name = name; this.type = type; this.unshared = unshared; - signature = getClassSignature(type).intern(); + signature = null; field = null; } @@ -242,7 +242,7 @@ */ // REMIND: deprecate? public char getTypeCode() { - return signature.charAt(0); + return getSignature().charAt(0); } /** @@ -252,7 +252,7 @@ */ // REMIND: deprecate? public String getTypeString() { - return isPrimitive() ? null : signature; + return isPrimitive() ? null : getSignature(); } /** @@ -284,7 +284,7 @@ */ // REMIND: deprecate? public boolean isPrimitive() { - char tcode = signature.charAt(0); + char tcode = getTypeCode(); return ((tcode != 'L') && (tcode != '[')); } @@ -336,6 +336,14 @@ * 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) { + sig = signature = getClassSignature(type).intern(); + } + return sig; } }