モジュール java.base
パッケージ java.util.spi

クラスLocaleServiceProvider

  • 直系の既知のサブクラス:
    BreakIteratorProvider, CalendarDataProvider, CalendarNameProvider, CollatorProvider, CurrencyNameProvider, DateFormatProvider, DateFormatSymbolsProvider, DecimalFormatSymbolsProvider, LocaleNameProvider, NumberFormatProvider, TimeZoneNameProvider

    public abstract class LocaleServiceProvider
    extends Object

    これは、ロケールに依存するすべてのサービス・プロバイダ・インタフェース(SPI)のスーパー・クラスです。

    ロケール依存サービス・プロバイダ・インタフェースは、java.textおよびjava.utilパッケージ内のロケール依存クラスに対応するインタフェースです。 これらのインタフェースを使えば、これらのパッケージでロケール依存オブジェクトを構築したりローカライズされた名前を取得したりできます。 java.textおよびjava.utilパッケージ内のロケールに依存するファクトリ・メソッドや名前取得メソッドは、プロバイダ・インタフェースの実装を使用することで、Java実行環境自体がサポートする一連のロケールに含まれないロケールをサポートします。

    ロケール依存サービス・プロバイダ実装のパッケージ化

    これらのロケールセンシティブなサービスの実装は、それらをアプリケーション・クラス・パスに追加することによって利用可能にすることができます。 各プロバイダは、リソース・ディレクトリMETA-INF/services内のプロバイダ構成ファイルを使ってプロバイダ自体を識別しますが、その際、プロバイダ・インタフェースの完全指定クラス名をファイル名として使用します。 このファイルには、具象プロバイダ・クラスの完全指定名が1行に1つずつ記述されます。 行の終端は、改行('\n')、キャリッジ・リターン('\r')、またはキャリッジ・リターンと改行の組み合わせによって表されます。 それぞれの名前を囲む空白文字とタブ文字、および空白行は無視されます。 コメント文字は「#」(ハッシュ記号)です。各行では、最初のコメント文字以降の文字はすべて無視されます。 ファイルはUTF-8で符号化されている必要があります。

    特定の具象プロバイダ・クラスが複数の構成ファイル内、または同じ構成ファイル内で繰返し指定されている場合、重複した指定は無視されます。 特定のプロバイダを指定した構成ファイルを、プロバイダ自体と同じJARファイル(またはその他の配布単位)内に含める必要はありません。 このプロバイダには、構成ファイルの検索時に最初に照会されたクラス・ローダーからアクセスできなければいけません。なお、そのクラス・ローダーは、ファイルをロードしたクラス・ローダーと同一であるとは限りません。

    たとえば、DateFormatProviderクラスの実装は、次のファイルを含むJARファイルの形態をとるべきです。

     META-INF/services/java.text.spi.DateFormatProvider
     
    さらに、ファイルjava.text.spi.DateFormatProviderには次のような行が含まれているべきです。
     com.foo.DateFormatProviderImpl
     
    これは、DateFormatProviderを実装するクラスの完全指定クラス名です。

    ロケール依存サービスの呼出し

    java.textおよびjava.utilパッケージ内のロケールに依存するファクトリ・メソッドや名前取得メソッドは、サービス・プロバイダのメソッドを必要に応じて呼び出すことで、要求されたロケールをサポートします。 それらのメソッドはまず、Java実行環境自体が要求されたロケールをサポートするかどうかをチェックし、サポートが使用可能であればそのサポートを使用します。 そうでない場合、それらは、適切なインタフェースのインストール済みプロバイダのisSupportedLocaleメソッドを呼び出すことで、要求されたロケールをサポートするプロバイダを検索します。 そのようなプロバイダが見つかった場合、そのプロバイダのその他のメソッドが呼び出され、要求されたオブジェクトまたは名前が取得されます。 ロケールがサポートされてるかどうかをチェックする場合、デフォルトでロケールの拡張は無視されます。 (ロケールの拡張もチェックする場合は、isSupportedLocaleメソッドをオーバーライドする必要があります。) Java実行時環境自体もインストールされているプロバイダも要求されたロケールをサポートしない場合、メソッドは候補ロケールのリストを進み、マッチが見つかるまで、それぞれ使用可能かどうかのチェックを繰り返します。 候補ロケールのリストの作成に使用されるアルゴリズムは、デフォルトでResourceBundleによって使用されるものと同じです(詳細についてはgetCandidateLocalesを参照してください)。 候補リストからロケールが解決された場合でも、要求されたオブジェクトまたは名前を返すメソッドは、Locale拡張を含む元の要求されたロケールで呼び出されます。 Java実行時環境は、この処理が確実に終了するように、すべてのロケールに依存するサービスのルート・ロケールをサポートする必要があります。

    名前のプロバイダ(その他のオブジェクトのプロバイダではない)は、getAvailableLocalesの戻り値に含めることでサポートを宣言したロケールに対しても、一部の名前要求にnullを返すことが許されています。 同様に、Java実行環境自体は、サポートするすべてのロケールのすべての名前を保持していなくてもかまいません。 これは、名前の要求対象となるオブジェクト群が、規模が大きかったり時間の経過に従って変化したりする可能性があるため、それらを完全にカバーすることが常に実現可能とはかぎらないからです。 Java実行環境またはプロバイダが名前の代わりにnullを返した場合、そのロケールがまるでサポートされていなかったかのように、上記で説明したとおりに検索処理が進みます。

    ロケールに依存するサービスの検索順序は、"java.locale.providers"システム・プロパティを使用して構成できます。 このシステム・プロパティは、ユーザーの優先される、ロケールに依存するサービスの検索順序をカンマで区切って宣言します。 これは、Javaランタイムの起動時にのみ読み取られるため、後でSystem.setProperty()を呼び出しても順序に影響しません。

    Java Runtime Environmentには、次の4つのロケール・プロバイダが用意されています:

    • "CLDR": Unicode Consortium 「CLDRプロジェクト」に基づくプロバイダ。
    • "COMPAT": JDK8以前のJDKリリースと互換性のあるロケールセンシティブなサービスを表します。(JDK8と同じ"JRE")。
    • "SPI": このLocaleServiceProviderクラスのサブクラスを実装するロケールセンシティブなサービスを表します。
    • "HOST": 基になるオペレーティング・システムのユーザー・カスタム設定を反映するプロバイダ。 このプロバイダは、Java Runtime Environmentの実装によっては使用できない場合があります。
    • "JRE": "COMPAT"と同義語を表します。 この名前は非推奨にされ、JDKの将来のリリースで削除される予定です。

    たとえば、プロパティに次が指定されている場合:

     java.locale.providers=SPI,CLDR,COMPAT
     
    SPIプロバイダのロケール・センシティブなサービスが最初に検索されます。 必要なロケール・センシティブなサービスが利用できない場合、ランタイムはCLDR、COMPATの順に検索します。

    優先ロケール・プロバイダを検索するデフォルトの順序は"CLDR、COMPAT"です。したがって、"CLDR、COMPAT"の指定はデフォルトの動作と同じです。 ロケールに依存するサービスの実装を必要とするアプリケーションでは、Javaランタイムがクラスパスからロードするために、"SPI"を明示的に指定する必要があります。

    導入されたバージョン:
    1.6
    • コンストラクタの詳細

      • LocaleServiceProvider

        protected LocaleServiceProvider()
        新しいロケール・サービス・プロバイダを初期化します。
        例外:
        SecurityException - セキュリティ・マネージャがインストールされていて、RuntimePermission("localeServiceProvider")を拒否した場合
    • メソッドの詳細

      • getAvailableLocales

        public abstract Locale[] getAvailableLocales()
        このロケール・サービス・プロバイダがローカライズ済みのオブジェクトや名前を提供可能な、すべてのロケールを含む配列を返します。 この情報は、DateFormat.getAvailableLocales()など、ロケールに依存するサービスのgetAvailableLocales()値を構成するために使用されます。

        このメソッドによって返される配列には、拡張だけが異なる複数のLocaleオブジェクトを含めないでください。

        戻り値:
        このロケール・サービス・プロバイダがローカライズ済みのオブジェクトや名前を提供可能な、すべてのロケールを含む配列。
      • isSupportedLocale

        public boolean isSupportedLocale​(Locale locale)
        指定されたlocaleがこのロケール・サービス・プロバイダでサポートされている場合はtrueを返します。 指定されたlocaleには、サポートの判断で考慮すべき拡張が含まれることがあります。

        指定されたlocaleと使用可能なロケールの両方のすべての拡張を無視して、指定されたlocaleが、getAvailableLocales()によって返される使用可能ないずれかのLocaleに等しい場合、デフォルトの実装はtrueを返します。 具象ロケール・サービス・プロバイダ実装がLocale拡張対応である場合、それらの実装ではこのメソッドをオーバーライドしてください。 たとえば、DecimalFormatSymbolsProvider実装では、指定されたlocaleの拡張をチェックし、番号付けシステムが指定されていて、サポートできるかどうかを確認する必要があります。 ただし、CollatorProvider実装は、特定の番号付けシステムに影響を受けないことがあり、その場合は、番号付けシステムの拡張を無視してください。

        パラメータ:
        locale - テストするLocale
        戻り値:
        指定されたlocaleがこのプロバイダでサポートされる場合はtrueを返し、それ以外の場合はfalseを返します。
        例外:
        NullPointerException - 指定されたlocalenullの場合
        導入されたバージョン:
        1.8
        関連項目:
        Locale.hasExtensions(), Locale.stripExtensions()