LocaleServiceProvider: Locale sensitive factory methods and methods for name retrieval in the java.text and java.util packages invoke service provider methods when needed to support the requested locale. The methods first check whether the Java runtime environment itself supports the requested locale, and use its support if available. Otherwise, they call the getAvailableLocales() methods of installed providers for the appropriate interface to find one that supports the requested locale.
Таким образом, если JRE поддерживает запрошенный языковой стандарт, вы не можете переопределить его с настраиваемым провайдером в вашем добавочном номере, поскольку у провайдеров по умолчанию будет задан вопросfirst.
Пример, который пытается предоставить новый символ для UAH
для локали xx_YY
BungaBunga и uk_UA
ungarn $$$ :
public class UkCurrencyNameProvider extends CurrencyNameProvider {
private static final Locale XX_YY = new Locale("xx", "YY");
private static final Locale UK_UA = new Locale("uk", "UA");
private static final Map<Locale, String> SYMBOL_MAP;
static {
SYMBOL_MAP = new HashMap<Locale, String>();
UkCurrencyNameProvider.SYMBOL_MAP.put(UkCurrencyNameProvider.XX_YY,
"BungaBunga");
UkCurrencyNameProvider.SYMBOL_MAP.put(UK_UA, "ungarn$$$");
}
private static final Locale[] AVAILABLE_LOCALES = UkCurrencyNameProvider.SYMBOL_MAP
.keySet().toArray(
new Locale[UkCurrencyNameProvider.SYMBOL_MAP.size()]);
/*
* (non-Javadoc)
* @see java.util.spi.CurrencyNameProvider#getSymbol(java.lang.String,
* java.util.Locale)
*/
@Override
public String getSymbol(final String currencyCode, final Locale locale) {
final String result;
if ("UAH".equals(currencyCode)) {
result = UkCurrencyNameProvider.SYMBOL_MAP.get(locale);
} else {
result = null;
}
return result;
}
/*
* (non-Javadoc)
* @see java.util.spi.LocaleServiceProvider#getAvailableLocales()
*/
@Override
public Locale[] getAvailableLocales() {
return UkCurrencyNameProvider.AVAILABLE_LOCALES.clone();
}
}
Код
Locale[] test=new Locale[] {new Locale("xx","YY"),new Locale("uk","UA")};
for (Locale loc:test)
{System.out.println(loc+": "+Currency.getInstance("UAH").getSymbol(loc));}
будет выводить
xx_YY: BungaBunga
uk_UA: грл.
, потому что стандартная JRE знает о uk_UA и предоставит ее уже известный символ валюты грл. .Для xx_YY JRE не имеет никакой информации и спросит поставщиков в расширении.Таможенный поставщик вернет BungaBunga .