如何在某处使用java.util.Locale作为键?

时间:2009-12-27 20:51:38

标签: java locale equality

java.util.Locale是其中一个类,我想知道我是不是太傻了,还是那个写它的人。马克戴维斯在身边吗?

据我所知,这个类不应该被使用。类中的内部缓存是私有的。工厂包私有。 equals()使用==来比较字符串。这意味着我无法比较该类的实例是否相等,除非我自己创建实例,将它们放在某个地方的缓存中,违反了DRY。

这是我应该做的吗?对这种行为有没有明智的解释???

2 个答案:

答案 0 :(得分:3)

这是因为传递给构造函数的所有String都是intern() - ed。一个值得怀疑的做法,但最终行为是正确的。


3参数构造函数是

public Locale(String language, String country, String variant) {
    this.language = convertOldISOCodes(language);
    this.country = toUpperCase(country).intern();
    this.variant = variant.intern();
}

然后在

private String convertOldISOCodes(String language) { 
    // we accept both the old and the new ISO codes for the languages whose ISO 
    // codes have changed, but we always store the OLD code, for backward compatibility 
    language = toLowerCase(language).intern(); 

答案 1 :(得分:2)

您可以随时使用locale.toString()来放置地图,以便解决这个问题。

或者您可以打包Localeclass LocaleWrapper { private Locale locale; .. }),正确实施equals方法,然后使用包装器。