commons-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From bay...@apache.org
Subject svn commit: r791726 - /commons/proper/lang/trunk/src/java/org/apache/commons/lang/LocaleUtils.java
Date Tue, 07 Jul 2009 07:10:02 GMT
Author: bayard
Date: Tue Jul  7 07:10:02 2009
New Revision: 791726

URL: http://svn.apache.org/viewvc?rev=791726&view=rev
Log:
Moving availableLocaleSet and availableLocaleList to both lazily initialize in a separate
synchronized method. This brings the two pieces of code into line with each other, allows
availableLocaleSet() to be unsynchronized as desired in LANG-488 and removes the static initialization
of availableLocaleList() as requested in LANG-511

Modified:
    commons/proper/lang/trunk/src/java/org/apache/commons/lang/LocaleUtils.java

Modified: commons/proper/lang/trunk/src/java/org/apache/commons/lang/LocaleUtils.java
URL: http://svn.apache.org/viewvc/commons/proper/lang/trunk/src/java/org/apache/commons/lang/LocaleUtils.java?rev=791726&r1=791725&r2=791726&view=diff
==============================================================================
--- commons/proper/lang/trunk/src/java/org/apache/commons/lang/LocaleUtils.java (original)
+++ commons/proper/lang/trunk/src/java/org/apache/commons/lang/LocaleUtils.java Tue Jul  7
07:10:02 2009
@@ -40,18 +40,18 @@
 public class LocaleUtils {
 
     /** Unmodifiable list of available locales. */
-    private static final List<Locale> cAvailableLocaleList;
+    //@GuardedBy("this")
+    private static List<Locale> cAvailableLocaleList; // lazily created by availableLocaleList()
+
     /** Unmodifiable set of available locales. */
     //@GuardedBy("this")
-    private static Set<Locale> cAvailableLocaleSet; // lazily created by availableLocaleSet()
+    private static Set<Locale> cAvailableLocaleSet;   // lazily created by availableLocaleSet()
+
     /** Unmodifiable map of language locales by country. */
     private static final Map<String, List<Locale>> cLanguagesByCountry = Collections.synchronizedMap(new
HashMap<String, List<Locale>>());
+
     /** Unmodifiable map of country locales by language. */
     private static final Map<String, List<Locale>> cCountriesByLanguage = Collections.synchronizedMap(new
HashMap<String, List<Locale>>());
-    static {
-        List<Locale> list = Arrays.asList(Locale.getAvailableLocales());
-        cAvailableLocaleList = Collections.unmodifiableList(list);
-    }
 
     /**
      * <p><code>LocaleUtils</code> instances should NOT be constructed
in standard programming.
@@ -193,9 +193,24 @@
      * @return the unmodifiable list of available locales
      */
     public static List<Locale> availableLocaleList() {
+        if(cAvailableLocaleList == null) { 
+            initAvailableLocaleList(); 
+        }
         return cAvailableLocaleList;
     }
 
+    /**
+     * Initializes the availableLocaleList. It is separate from availableLocaleList() 
+     * to avoid the synchronized block affecting normal use, yet synchronized and 
+     * lazy loading to avoid a static block affecting other methods in this class. 
+     */
+    private static synchronized void initAvailableLocaleList() {
+        if(cAvailableLocaleList == null) {
+            List<Locale> list = Arrays.asList(Locale.getAvailableLocales());
+            cAvailableLocaleList = Collections.unmodifiableList(list);
+        }
+    }
+
     //-----------------------------------------------------------------------
     /**
      * <p>Obtains an unmodifiable set of installed locales.</p>
@@ -207,13 +222,21 @@
      * @return the unmodifiable set of available locales
      */
     public static synchronized Set<Locale> availableLocaleSet() {
-        Set<Locale> set = cAvailableLocaleSet;
-        if (set == null) {
-            set = new HashSet<Locale>(availableLocaleList());
-            set = Collections.unmodifiableSet(set);
-            cAvailableLocaleSet = set;
+        if(cAvailableLocaleSet == null) { 
+            initAvailableLocaleSet(); 
+        }
+        return cAvailableLocaleSet;
+    }
+
+    /**
+     * Initializes the availableLocaleSet. It is separate from availableLocaleSet() 
+     * to avoid the synchronized block affecting normal use, yet synchronized and 
+     * lazy loading to avoid a static block affecting other methods in this class. 
+     */
+    private static synchronized void initAvailableLocaleSet() {
+        if(cAvailableLocaleSet == null) {
+            cAvailableLocaleSet = Collections.unmodifiableSet( new HashSet<Locale>(availableLocaleList())
);
         }
-        return set;
     }
 
     //-----------------------------------------------------------------------



Mime
View raw message