java.util.Locale
是其中一个类,我想知道我是不是太傻了,还是那个写它的人。马克戴维斯在身边吗?
据我所知,这个类不应该被使用。类中的内部缓存是私有的。工厂包私有。 equals()
使用==
来比较字符串。这意味着我无法比较该类的实例是否相等,除非我自己创建实例,将它们放在某个地方的缓存中,违反了DRY。
这是我应该做的吗?对这种行为有没有明智的解释???
答案 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()
来放置地图,以便解决这个问题。
或者您可以打包Locale
(class LocaleWrapper { private Locale locale; .. }
),正确实施equals
方法,然后使用包装器。