如何使用java.util.Locale作为某个地方的键?

如何使用java.util.Locale作为某个地方的键?,java,locale,equality,Java,Locale,Equality,java.util.Locale就是这样一个类,我想知道是我太蠢了,还是编写它的人太蠢了。马克·戴维斯在吗 据我所知,这个类不应该被使用。类中的内部缓存是私有的。工厂包是私人的。equals使用==来比较字符串。这意味着我不能比较类的实例是否相等,除非我自己创建实例,将它们放在缓存中的某个地方 这是我应该做的吗?对这种行为有合理的解释吗?这种情况的发生是因为传递给构造函数的所有字符串都是经过实习的。这是一种有问题的做法,但最终这种行为是正确的 三参数构造函数是 public Locale(Str

java.util.Locale就是这样一个类,我想知道是我太蠢了,还是编写它的人太蠢了。马克·戴维斯在吗

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

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

这种情况的发生是因为传递给构造函数的所有字符串都是经过实习的。这是一种有问题的做法,但最终这种行为是正确的

三参数构造函数是

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放入地图


或者你可以包装你的语言环境类LocaleWrapper{private Locale;。},正确地实现equals方法,然后使用包装器。

你说得对,我错过了。不幸的是,对于我的测试用例,equals仍然返回false。有没有失败的特定值?我做了一个简单的测试,它通过了,只使用新的Localeen,嗯。好的,找到了:我从Db4o读取了locale,这意味着它们被序列化,这破坏了类。太好了…我做了一个小的序列化测试,效果很好。有关实际代码,请参阅。您不应该使用java.util.Locale.getInstanceString、String、String吗?