2

java.util.Locale是我想知道我是否太愚蠢或写它的人的那些课程之一。马克戴维斯在吗?

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

这是我应该做的吗?这种行为有合理的解释吗???

4

2 回答 2

3

发生这种情况是因为String传递给构造函数的所有 s 都是intern()-ed。一个有问题的做法,但最终的行为是正确的。


三参数构造函数是

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(); 
于 2009-12-27T20:59:00.910 回答
2

您始终可以使用locale.toString()用于放入地图以解决此问题。

或者您可以包装您的Locale( class LocaleWrapper { private Locale locale; .. }),equals正确实现该方法,然后使用包装器。

于 2009-12-27T21:49:35.947 回答