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