--- old/src/share/classes/java/text/NumberFormat.java Fri Jul 20 11:43:39 2012
+++ new/src/share/classes/java/text/NumberFormat.java Fri Jul 20 11:43:38 2012
@@ -54,7 +54,8 @@
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicLong;
import java.util.spi.LocaleServiceProvider;
-import sun.util.LocaleServiceProviderPool;
+import sun.util.locale.provider.LocaleProviderAdapter;
+import sun.util.locale.provider.LocaleServiceProviderPool;
import sun.util.resources.LocaleData;
/**
@@ -232,6 +233,7 @@
* mode being set to RoundingMode.UNNECESSARY
* @see java.text.FieldPosition
*/
+ @Override
public StringBuffer format(Object number,
StringBuffer toAppendTo,
FieldPosition pos) {
@@ -272,6 +274,7 @@
* error, returns null.
* @exception NullPointerException if pos
is null.
*/
+ @Override
public final Object parseObject(String source, ParsePosition pos) {
return parse(source, pos);
}
@@ -501,8 +504,9 @@
}
/**
- * Overrides hashCode
+ * Overrides hashCode.
*/
+ @Override
public int hashCode() {
return maximumIntegerDigits * 37 + maxFractionDigits;
// just enough fields for a reasonable distribution
@@ -509,8 +513,9 @@
}
/**
- * Overrides equals
+ * Overrides equals.
*/
+ @Override
public boolean equals(Object obj) {
if (obj == null) {
return false;
@@ -531,8 +536,9 @@
}
/**
- * Overrides Cloneable
+ * Overrides Cloneable.
*/
+ @Override
public Object clone() {
NumberFormat other = (NumberFormat) super.clone();
return other;
@@ -741,42 +747,29 @@
private static NumberFormat getInstance(Locale desiredLocale,
int choice) {
- // Check whether a provider can provide an implementation that's closer
- // to the requested locale than what the Java runtime itself can provide.
- LocaleServiceProviderPool pool =
- LocaleServiceProviderPool.getPool(NumberFormatProvider.class);
- if (pool.hasProviders()) {
- NumberFormat providersInstance = pool.getLocalizedObject(
- NumberFormatGetter.INSTANCE,
- desiredLocale,
- choice);
- if (providersInstance != null) {
- return providersInstance;
- }
+ LocaleProviderAdapter adapter = LocaleProviderAdapter.getAdapter(NumberFormatProvider.class, desiredLocale);
+ NumberFormatProvider provider = adapter.getNumberFormatProvider();
+ NumberFormat numberFormat = null;
+ switch (choice) {
+ case NUMBERSTYLE:
+ numberFormat = provider.getNumberInstance(desiredLocale);
+ break;
+ case PERCENTSTYLE:
+ numberFormat = provider.getPercentInstance(desiredLocale);
+ break;
+ case CURRENCYSTYLE:
+ numberFormat = provider.getCurrencyInstance(desiredLocale);
+ break;
+ case INTEGERSTYLE:
+ numberFormat = provider.getIntegerInstance(desiredLocale);
+ break;
}
- /* try the cache first */
- String[] numberPatterns = cachedLocaleData.get(desiredLocale);
- if (numberPatterns == null) { /* cache miss */
- ResourceBundle resource = LocaleData.getNumberFormatData(desiredLocale);
- numberPatterns = resource.getStringArray("NumberPatterns");
- /* update cache */
- cachedLocaleData.put(desiredLocale, numberPatterns);
+ if (numberFormat == null) {
+ throw new InternalError("NumberFormat instance creation failed.");
}
- DecimalFormatSymbols symbols = DecimalFormatSymbols.getInstance(desiredLocale);
- int entry = (choice == INTEGERSTYLE) ? NUMBERSTYLE : choice;
- DecimalFormat format = new DecimalFormat(numberPatterns[entry], symbols);
-
- if (choice == INTEGERSTYLE) {
- format.setMaximumFractionDigits(0);
- format.setDecimalSeparatorAlwaysShown(false);
- format.setParseIntegerOnly(true);
- } else if (choice == CURRENCYSTYLE) {
- format.adjustForCurrencyDefaultFractionDigits();
- }
-
- return format;
+ return numberFormat;
}
/**
@@ -841,11 +834,6 @@
stream.defaultWriteObject();
}
- /**
- * Cache to hold the NumberPatterns of a Locale.
- */
- private static final Hashtable cachedLocaleData = new Hashtable<>(3);
-
// Constants used by factory methods to specify a style of format.
private static final int NUMBERSTYLE = 0;
private static final int CURRENCYSTYLE = 1;
@@ -1056,6 +1044,7 @@
* @throws InvalidObjectException if the constant could not be resolved.
* @return resolved NumberFormat.Field constant
*/
+ @Override
protected Object readResolve() throws InvalidObjectException {
if (this.getClass() != NumberFormat.Field.class) {
throw new InvalidObjectException("subclass didn't correctly implement readResolve");
@@ -1127,36 +1116,4 @@
*/
public static final Field EXPONENT_SIGN = new Field("exponent sign");
}
-
- /**
- * Obtains a NumberFormat instance from a NumberFormatProvider implementation.
- */
- private static class NumberFormatGetter
- implements LocaleServiceProviderPool.LocalizedObjectGetter {
- private static final NumberFormatGetter INSTANCE = new NumberFormatGetter();
-
- public NumberFormat getObject(NumberFormatProvider numberFormatProvider,
- Locale locale,
- String key,
- Object... params) {
- assert params.length == 1;
- int choice = (Integer)params[0];
-
- switch (choice) {
- case NUMBERSTYLE:
- return numberFormatProvider.getNumberInstance(locale);
- case PERCENTSTYLE:
- return numberFormatProvider.getPercentInstance(locale);
- case CURRENCYSTYLE:
- return numberFormatProvider.getCurrencyInstance(locale);
- case INTEGERSTYLE:
- return numberFormatProvider.getIntegerInstance(locale);
- default:
- assert false : choice;
- }
-
- return null;
- }
- }
}