2009-12-27 62 views
2

java.util.Locale是其中的一个类,我不知道我是不是太笨或写这个的人。马克戴维斯在附近吗?如何将java.util.Locale用作关键字?

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

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

回答

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(); 
+0

你说得对,我错过了。不幸的是,equals()对我的测试用例仍然返回false。 – 2009-12-27 21:01:23

+0

任何具体的值失败?我做了一个简单的测试,它传递给我(只是使用'新Locale(“en”,“EN”)')。 – 2009-12-27 21:06:21

+0

好吧,找到它了:我正在从Db4o读取Locales,这意味着它们会被序列化,从而破坏课程。精彩的...... – 2009-12-27 21:06:26

2

您可以随时使用locale.toString()用于放入地图,以围绕工作这一点。

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