< prev index next >

src/java.base/share/classes/java/util/Locale.java

Print this page

        

*** 44,53 **** --- 44,54 ---- import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.ObjectStreamField; import java.io.Serializable; import java.text.MessageFormat; + import java.util.concurrent.ConcurrentHashMap; import java.util.spi.LocaleNameProvider; import sun.security.action.GetPropertyAction; import sun.util.locale.BaseLocale; import sun.util.locale.InternalLocaleBuilder;
*** 598,607 **** --- 599,672 ---- /** serialization ID */ static final long serialVersionUID = 9149081749638150636L; /** + * Enum for specifying the type defined in ISO 3166. This enum is used to + * retrieve the two-letter ISO3166-1 alpha-2, three-letter ISO3166-1 + * alpha-3, four-letter ISO3166-3 country codes. + * + * @see #getISOCountries(Locale.IsoCountryCode) + * @since 9 + */ + public static enum IsoCountryCode { + /** + * PART1_ALPHA2 is used to represent the ISO3166-1 alpha-2 two letter + * country codes. + */ + PART1_ALPHA2 { + @Override + Set<String> getISOCountriesImpl() { + return Set.of(Locale.getISOCountries()); + } + }, + + /** + * + * PART1_ALPHA3 is used to represent the ISO3166-1 alpha-3 three letter + * country codes. + */ + + PART1_ALPHA3 { + @Override + Set<String> getISOCountriesImpl() { + return LocaleISOData.computeISO3166_1Alpha3Countries(); + } + }, + + /** + * PART3 is used to represent the ISO3166-3 four letter country codes. + */ + + PART3 { + @Override + Set<String> getISOCountriesImpl() { + return Set.of(LocaleISOData.ISO3166_3); + } + }; + + /** + * Concrete implementation of this mapping function attempts to compute value + * for iso3166CodesMap for each IsoCountryCode type key. + */ + abstract Set<String> getISOCountriesImpl(); + + /** + * Map to hold country codes for each ISO3166 part. + */ + private static Map<IsoCountryCode, Set<String>> iso3166CodesMap = new ConcurrentHashMap<>(); + + /** + * This method is called from Locale class to retrieve country code set + * for getISOCountries(type) + */ + static Set<String> retrieveISOCountryCodes(IsoCountryCode type) { + return iso3166CodesMap.computeIfAbsent(type, IsoCountryCode::getISOCountriesImpl); + } + } + + /** * Display types for retrieving localized names from the name providers. */ private static final int DISPLAY_LANGUAGE = 0; private static final int DISPLAY_COUNTRY = 1; private static final int DISPLAY_VARIANT = 2;
*** 994,1009 **** } /** * Returns a list of all 2-letter country codes defined in ISO 3166. * Can be used to create Locales. * <p> * <b>Note:</b> The <code>Locale</code> class also supports other codes for * country (region), such as 3-letter numeric UN M.49 area codes. * Therefore, the list returned by this method does not contain ALL valid * codes that can be used to create Locales. ! * * @return An array of ISO 3166 two-letter country codes. */ public static String[] getISOCountries() { if (isoCountries == null) { isoCountries = getISO2Table(LocaleISOData.isoCountryTable); --- 1059,1080 ---- } /** * Returns a list of all 2-letter country codes defined in ISO 3166. * Can be used to create Locales. + * This method is equivalent to {@link #getISOCountries(Locale.IsoCountryCode type)} + * with {@code type} {@link IsoCountryCode#PART1_ALPHA2}. * <p> * <b>Note:</b> The <code>Locale</code> class also supports other codes for * country (region), such as 3-letter numeric UN M.49 area codes. * Therefore, the list returned by this method does not contain ALL valid * codes that can be used to create Locales. ! * <p> ! * Note that this method does not return obsolete 2-letter country codes. ! * ISO3166-3 codes which designate country codes for those obsolete codes, ! * can be retrieved from {@link #getISOCountries(Locale.IsoCountryCode type)} with ! * {@code type} {@link IsoCountryCode#PART3}. * @return An array of ISO 3166 two-letter country codes. */ public static String[] getISOCountries() { if (isoCountries == null) { isoCountries = getISO2Table(LocaleISOData.isoCountryTable);
*** 1012,1021 **** --- 1083,1106 ---- System.arraycopy(isoCountries, 0, result, 0, isoCountries.length); return result; } /** + * Returns a {@code Set} of ISO3166 country codes for the specified type. + * + * @param type {@link Locale.IsoCountryCode} specified ISO code type. + * @see java.util.Locale.IsoCountryCode + * @throws NullPointerException if type is null + * @return a {@code Set} of ISO country codes for the specified type. + * @since 9 + */ + public static Set<String> getISOCountries(IsoCountryCode type) { + Objects.requireNonNull(type); + return IsoCountryCode.retrieveISOCountryCodes(type); + } + + /** * Returns a list of all 2-letter language codes defined in ISO 639. * Can be used to create Locales. * <p> * <b>Note:</b> * <ul>
< prev index next >