2009-12-27 27 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方法,然後使用包裝。

相關問題