2017-10-28 3 views
0

Locale.getAvailableLocales()を呼び出すと、特定の順序でロケールが一覧表示されます(例:「en_US」は英語の最初のロケール)。Locale.getAvailableLocales()の注文

これは私に適していますが、私は思っていた:

この順序が設定されている

を?私はソースコードに従いましたが、生データが取得された時点からStringHashMapになっています。特に: "sun.text.resources.FormatData"、Listがreturnedであるところまで、注文がどこで行われているのかわかりません。 (生の文字列データ "en_US"は英語の最初のロケールではありません)。

ありがとうございます。ここで

+2

メソッドのjavadocは順序付けに何ら保証を提供しないので、それを数えてはいけません。注文したい場合は、配列を自分で並べ替えます。 –

答えて

1

Locale#getAvailableLocalesのソースコードです:

public static Locale[] getAvailableLocales() { 
    return LocaleServiceProviderPool.getAllAvailableLocales(); 
} 

そして、ここではLocaleServiceProviderPool.getAllAvailableLocalesのソースコードです:

public synchronized Locale[] getAvailableLocales() { 
    if (availableLocales == null) { 
     availableLocales = new HashSet<Locale>(getJRELocales()); 
     if (hasProviders()) { 
      availableLocales.addAll(getProviderLocales()); 
     } 
    } 
    Locale[] tmp = new Locale[availableLocales.size()]; 
    availableLocales.toArray(tmp); 
    return tmp; 
} 

私たちは、ロケールはハッシュセットに格納されていることをはっきりと見ることができ、注文はありません。メソッドが何らかの順序があることを暗示する可能性があるので、メソッドがロケールの配列を返すことはおそらく誤解を招く可能性があります。

@JBNizetは、自分のコードでロケールの一覧を並べ替えるだけでよいとコメントしました。

+0

なぜ誤解を招くのですか? 'HashSet'は順序付けを保証するものではありませんが、配列は何をするのでしょうか?それにもかかわらず、このメソッドはロケールを一貫した順序で返します(これは私のニーズに合っています)。私はそれに頼ることができるかどうかを判断するために順序がどこにあるのかを見たいと思っていましたが、私はあなたと他の人が私が...べきではないことを示唆しているのを見ています。 – theyuv

+0

@theyuv Java 9で新しいロケールが導入されたらどうなりますか?その後、注文が壊れます。 –