< prev index next >

src/java.base/share/classes/sun/util/locale/BaseLocale.java

Print this page
rev 54380 : 8221701: Archive constant BaseLocales
Reviewed-by: naoto

*** 30,47 **** ******************************************************************************* */ package sun.util.locale; import java.lang.ref.SoftReference; import java.util.StringJoiner; public final class BaseLocale { ! public static final String SEP = "_"; ! private static final Cache CACHE = new Cache(); private final String language; private final String script; private final String region; private final String variant; --- 30,97 ---- ******************************************************************************* */ package sun.util.locale; + import jdk.internal.misc.VM; + import jdk.internal.vm.annotation.Stable; + import java.lang.ref.SoftReference; import java.util.StringJoiner; public final class BaseLocale { ! public static @Stable BaseLocale[] constantBaseLocales; ! public static final byte ENGLISH = 0, ! FRENCH = 1, ! GERMAN = 2, ! ITALIAN = 3, ! JAPANESE = 4, ! KOREAN = 5, ! CHINESE = 6, ! SIMPLIFIED_CHINESE = 7, ! TRADITIONAL_CHINESE = 8, ! FRANCE = 9, ! GERMANY = 10, ! ITALY = 11, ! JAPAN = 12, ! KOREA = 13, ! UK = 14, ! US = 15, ! CANADA = 16, ! CANADA_FRENCH = 17, ! ROOT = 18, ! NUM_CONSTANTS = 19; ! static { ! VM.initializeFromArchive(BaseLocale.class); ! BaseLocale[] baseLocales = constantBaseLocales; ! if (baseLocales == null) { ! baseLocales = new BaseLocale[NUM_CONSTANTS]; ! baseLocales[ENGLISH] = createInstance("en", ""); ! baseLocales[FRENCH] = createInstance("fr", ""); ! baseLocales[GERMAN] = createInstance("de", ""); ! baseLocales[ITALIAN] = createInstance("it", ""); ! baseLocales[JAPANESE] = createInstance("ja", ""); ! baseLocales[KOREAN] = createInstance("ko", ""); ! baseLocales[CHINESE] = createInstance("zh", ""); ! baseLocales[SIMPLIFIED_CHINESE] = createInstance("zh", "CN"); ! baseLocales[TRADITIONAL_CHINESE] = createInstance("zh", "TW"); ! baseLocales[FRANCE] = createInstance("fr", "FR"); ! baseLocales[GERMANY] = createInstance("de", "DE"); ! baseLocales[ITALY] = createInstance("it", "IT"); ! baseLocales[JAPAN] = createInstance("ja", "JP"); ! baseLocales[KOREA] = createInstance("ko", "KR"); ! baseLocales[UK] = createInstance("en", "GB"); ! baseLocales[US] = createInstance("en", "US"); ! baseLocales[CANADA] = createInstance("en", "CA"); ! baseLocales[CANADA_FRENCH] = createInstance("fr", "CA"); ! baseLocales[ROOT] = createInstance("", ""); ! constantBaseLocales = baseLocales; ! } ! } ! public static final String SEP = "_"; private final String language; private final String script; private final String region; private final String variant;
*** 65,96 **** } } // Called for creating the Locale.* constants. No argument // validation is performed. ! public static BaseLocale createInstance(String language, String region) { ! BaseLocale base = new BaseLocale(language, "", region, "", false); ! CACHE.put(new Key(base), base); ! return base; } public static BaseLocale getInstance(String language, String script, String region, String variant) { // JDK uses deprecated ISO639.1 language codes for he, yi and id ! if (language != null) { ! if (LocaleUtils.caseIgnoreMatch(language, "he")) { language = "iw"; ! } else if (LocaleUtils.caseIgnoreMatch(language, "yi")) { language = "ji"; ! } else if (LocaleUtils.caseIgnoreMatch(language, "id")) { language = "in"; } } Key key = new Key(language, script, region, variant, false); ! BaseLocale baseLocale = CACHE.get(key); ! return baseLocale; } public String getLanguage() { return language; } --- 115,171 ---- } } // Called for creating the Locale.* constants. No argument // validation is performed. ! private static BaseLocale createInstance(String language, String region) { ! return new BaseLocale(language, "", region, "", false); } public static BaseLocale getInstance(String language, String script, String region, String variant) { + + if (script == null) { + script = ""; + } + if (region == null) { + region = ""; + } + if (language == null) { + language = null; + } + if (variant == null) { + variant = ""; + } + + // Non-allocating for most uses + language = LocaleUtils.toLowerString(language); + region = LocaleUtils.toUpperString(region); + + // Check for constant base locales first + if (script.isEmpty() && variant.isEmpty()) { + for (BaseLocale baseLocale : constantBaseLocales) { + if (baseLocale.getLanguage().equals(language) + && baseLocale.getRegion().equals(region)) { + return baseLocale; + } + } + } + // JDK uses deprecated ISO639.1 language codes for he, yi and id ! if (!language.isEmpty()) { ! if (language.equals("he")) { language = "iw"; ! } else if (language.equals("yi")) { language = "ji"; ! } else if (language.equals("id")) { language = "in"; } } Key key = new Key(language, script, region, variant, false); ! return Cache.CACHE.get(key); } public String getLanguage() { return language; }
*** 169,218 **** private final BaseLocale holder; private final boolean normalized; private final int hash; - /** - * Creates a Key. language and region must be normalized - * (intern'ed in the proper case). - */ - private Key(BaseLocale locale) { - this.holder = locale; - this.holderRef = null; - this.normalized = true; - String language = locale.getLanguage(); - String region = locale.getRegion(); - assert LocaleUtils.toLowerString(language).intern() == language - && LocaleUtils.toUpperString(region).intern() == region - && locale.getVariant() == "" - && locale.getScript() == ""; - - int h = language.hashCode(); - if (region != "") { - int len = region.length(); - for (int i = 0; i < len; i++) { - h = 31 * h + LocaleUtils.toLower(region.charAt(i)); - } - } - hash = h; - } - private Key(String language, String script, String region, String variant, boolean normalize) { - if (language == null) { - language = ""; - } - if (script == null) { - script = ""; - } - if (region == null) { - region = ""; - } - if (variant == null) { - variant = ""; - } - BaseLocale locale = new BaseLocale(language, script, region, variant, normalize); this.normalized = normalize; if (normalized) { this.holderRef = new SoftReference<>(locale); this.holder = null; --- 244,255 ----
*** 289,298 **** --- 326,337 ---- } } private static class Cache extends LocaleObjectCache<Key, BaseLocale> { + private static final Cache CACHE = new Cache(); + public Cache() { } @Override protected Key normalizeKey(Key key) {
< prev index next >