java.util.Locale
是其中的一个类,我不知道我是不是太笨或写这个的人。马克戴维斯在附近吗?如何将java.util.Locale用作关键字?
据我所知,这个类不应该被使用。类中的内部缓存是私有的。工厂包装私人。 equals()
使用==
来比较字符串。这意味着我无法比较类的实例是否相等,除非我自己创建实例,将它们放到某处的缓存中,违反DRY。
这是我应该做的吗?有这种行为的理智解释吗?
java.util.Locale
是其中的一个类,我不知道我是不是太笨或写这个的人。马克戴维斯在附近吗?如何将java.util.Locale用作关键字?
据我所知,这个类不应该被使用。类中的内部缓存是私有的。工厂包装私人。 equals()
使用==
来比较字符串。这意味着我无法比较类的实例是否相等,除非我自己创建实例,将它们放到某处的缓存中,违反DRY。
这是我应该做的吗?有这种行为的理智解释吗?
发生这种情况是因为传递给构造函数的所有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();
您可以随时使用locale.toString()
用于放入地图,以围绕工作这一点。
或者你可以包装你的Locale
(class LocaleWrapper { private Locale locale; .. }
),正确实施equals
方法,然后使用包装。
你说得对,我错过了。不幸的是,equals()对我的测试用例仍然返回false。 – 2009-12-27 21:01:23
任何具体的值失败?我做了一个简单的测试,它传递给我(只是使用'新Locale(“en”,“EN”)')。 – 2009-12-27 21:06:21
好吧,找到它了:我正在从Db4o读取Locales,这意味着它们会被序列化,从而破坏课程。精彩的...... – 2009-12-27 21:06:26