United StatesChange Country, Oracle Worldwide Web Sites Communities I am a... I want to...
Bug ID: JDK-6799689 Make sun.misc.FloatingDecimal.hexFloatPattern static field initialized lazily
JDK-6799689 : Make sun.misc.FloatingDecimal.hexFloatPattern static field initialized lazily

Details
Type:
Enhancement
Submit Date:
2009-01-30
Status:
Resolved
Updated Date:
2010-05-10
Project Name:
JDK
Resolved Date:
2009-03-13
Component:
core-libs
OS:
generic
Sub-Component:
java.math
CPU:
generic
Priority:
P4
Resolution:
Fixed
Affected Versions:
7
Fixed Versions:

Related Reports
Backport:
Relates:

Sub Tasks

Description
sun.misc.FloatingDecimal has a static field of java.util.Pattern type that loads and initializes the regex classes.  This static field is used by parseHexString method to parse a hexadecimal floating-point string and should be initialized lazily to avoid regex classes to be pulled until it's really needed.

                                    

Comments
SUGGESTED FIX

--- a/src/share/classes/sun/misc/FloatingDecimal.java
+++ b/src/share/classes/sun/misc/FloatingDecimal.java
@@ -1867,10 +1867,16 @@ public class FloatingDecimal{
      * Grammar is compatible with hexadecimal floating-point constants
      * described in section 6.4.4.2 of the C99 specification.
      */
-    private static Pattern hexFloatPattern = Pattern.compile(
+    private static Pattern hexFloatPattern = null;
+    private static synchronized Pattern getHexFloatPattern() {
+        if (hexFloatPattern == null) {
+            hexFloatPattern = Pattern.compile(
                    //1           234                   56                7                   8      9
                     "([-+])?0[xX](((\\p{XDigit}+)\\.?)|((\\p{XDigit}*)\\.(\\p{XDigit}+)))[pP]([-+])?(\\p{Digit}+)[fFdD]?"
                     );
+        }
+        return hexFloatPattern;
+    }
  
     /*
      * Convert string s to a suitable floating decimal; uses the
@@ -1880,7 +1886,7 @@ public class FloatingDecimal{
    static FloatingDecimal parseHexString(String s) {
         // Verify string is a member of the hexadecimal floating-point
         // string language.
-        Matcher m = hexFloatPattern.matcher(s);
+        Matcher m = getHexFloatPattern().matcher(s);
         boolean validInput = m.matches();
                                     
2009-01-30
EVALUATION

Will fix this in JDK 7
                                     
2009-01-30



Hardware and Software, Engineered to Work Together