提交 e87b4d05 编写于 作者: N naoto

8036936: Use local locales

Summary: Made sure cache key is cleared on GC invocation
Reviewed-by: okutsu
上级 9d4d4689
......@@ -31,6 +31,7 @@
*/
package sun.util.locale;
import java.lang.ref.SoftReference;
public final class BaseLocale {
......@@ -163,11 +164,11 @@ public final class BaseLocale {
return h;
}
private static final class Key implements Comparable<Key> {
private final String lang;
private final String scrt;
private final String regn;
private final String vart;
private static final class Key {
private final SoftReference<String> lang;
private final SoftReference<String> scrt;
private final SoftReference<String> regn;
private final SoftReference<String> vart;
private final boolean normalized;
private final int hash;
......@@ -179,10 +180,10 @@ public final class BaseLocale {
assert language.intern() == language
&& region.intern() == region;
lang = language;
scrt = "";
regn = region;
vart = "";
lang = new SoftReference(language);
scrt = new SoftReference("");
regn = new SoftReference(region);
vart = new SoftReference("");
this.normalized = true;
int h = language.hashCode();
......@@ -203,40 +204,40 @@ public final class BaseLocale {
String variant, boolean normalized) {
int h = 0;
if (language != null) {
lang = language;
lang = new SoftReference(language);
int len = language.length();
for (int i = 0; i < len; i++) {
h = 31*h + LocaleUtils.toLower(language.charAt(i));
}
} else {
lang = "";
lang = new SoftReference("");
}
if (script != null) {
scrt = script;
scrt = new SoftReference(script);
int len = script.length();
for (int i = 0; i < len; i++) {
h = 31*h + LocaleUtils.toLower(script.charAt(i));
}
} else {
scrt = "";
scrt = new SoftReference("");
}
if (region != null) {
regn = region;
regn = new SoftReference(region);
int len = region.length();
for (int i = 0; i < len; i++) {
h = 31*h + LocaleUtils.toLower(region.charAt(i));
}
} else {
regn = "";
regn = new SoftReference("");
}
if (variant != null) {
vart = variant;
vart = new SoftReference(variant);
int len = variant.length();
for (int i = 0; i < len; i++) {
h = 31*h + variant.charAt(i);
}
} else {
vart = "";
vart = new SoftReference("");
}
hash = h;
this.normalized = normalized;
......@@ -244,28 +245,31 @@ public final class BaseLocale {
@Override
public boolean equals(Object obj) {
return (this == obj) ||
(obj instanceof Key)
&& this.hash == ((Key)obj).hash
&& LocaleUtils.caseIgnoreMatch(((Key)obj).lang, this.lang)
&& LocaleUtils.caseIgnoreMatch(((Key)obj).scrt, this.scrt)
&& LocaleUtils.caseIgnoreMatch(((Key)obj).regn, this.regn)
&& ((Key)obj).vart.equals(vart); // variant is case sensitive in JDK!
if (this == obj) {
return true;
}
@Override
public int compareTo(Key other) {
int res = LocaleUtils.caseIgnoreCompare(this.lang, other.lang);
if (res == 0) {
res = LocaleUtils.caseIgnoreCompare(this.scrt, other.scrt);
if (res == 0) {
res = LocaleUtils.caseIgnoreCompare(this.regn, other.regn);
if (res == 0) {
res = this.vart.compareTo(other.vart);
if (obj instanceof Key && this.hash == ((Key)obj).hash) {
String tl = this.lang.get();
String ol = ((Key)obj).lang.get();
if (tl != null && ol != null &&
LocaleUtils.caseIgnoreMatch(ol, tl)) {
String ts = this.scrt.get();
String os = ((Key)obj).scrt.get();
if (ts != null && os != null &&
LocaleUtils.caseIgnoreMatch(os, ts)) {
String tr = this.regn.get();
String or = ((Key)obj).regn.get();
if (tr != null && or != null &&
LocaleUtils.caseIgnoreMatch(or, tr)) {
String tv = this.vart.get();
String ov = ((Key)obj).vart.get();
return (ov != null && ov.equals(tv));
}
}
}
return res;
}
return false;
}
@Override
......@@ -278,10 +282,10 @@ public final class BaseLocale {
return key;
}
String lang = LocaleUtils.toLowerString(key.lang).intern();
String scrt = LocaleUtils.toTitleString(key.scrt).intern();
String regn = LocaleUtils.toUpperString(key.regn).intern();
String vart = key.vart.intern(); // preserve upper/lower cases
String lang = LocaleUtils.toLowerString(key.lang.get()).intern();
String scrt = LocaleUtils.toTitleString(key.scrt.get()).intern();
String regn = LocaleUtils.toUpperString(key.regn.get()).intern();
String vart = key.vart.get().intern(); // preserve upper/lower cases
return new Key(lang, scrt, regn, vart, true);
}
......@@ -294,12 +298,18 @@ public final class BaseLocale {
@Override
protected Key normalizeKey(Key key) {
assert key.lang.get() != null &&
key.scrt.get() != null &&
key.regn.get() != null &&
key.vart.get() != null;
return Key.normalize(key);
}
@Override
protected BaseLocale createObject(Key key) {
return new BaseLocale(key.lang, key.scrt, key.regn, key.vart);
return new BaseLocale(key.lang.get(), key.scrt.get(),
key.regn.get(), key.vart.get());
}
}
}
......@@ -57,8 +57,10 @@ public abstract class LocaleObjectCache<K, V> {
value = entry.get();
}
if (value == null) {
key = normalizeKey(key);
V newVal = createObject(key);
// make sure key is normalized *after* the object creation
// so that newVal is assured to be created from a valid key.
key = normalizeKey(key);
if (key == null || newVal == null) {
// subclass must return non-null key/value object
return null;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册