2

java.util.Locale私があまりにも愚かなのか、それともそれを書いた人なのか疑問に思うクラスの 1 つです。マーク・デイビスはいますか?

私が見る限り、このクラスは使用されるべきではありません。クラスの内部キャッシュは非公開です。ファクトリーパッケージプライベート。文字列の比較にequals()使用します。==これは、自分でインスタンスを作成し、それらをどこかにキャッシュに入れて DRY に違反しない限り、クラスのインスタンスが等しいかどうかを比較できないことを意味します。

これは私がすべきことですか?この動作についてまともな説明はありますか???

4

2 に答える 2

3

これはString、コンストラクターに渡されるすべての s が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(); 
于 2009-12-27T20:59:00.910 に答える
2

locale.toString()これを回避するために、マップを挿入するためにいつでも使用できます。

または、Locale( class LocaleWrapper { private Locale locale; .. }) をラップし、メソッドを適切に実装してequalsからラッパーを使用することもできます。

于 2009-12-27T21:49:35.947 に答える