public abstract class LocaleServiceProvider extends Object
これは、ロケールに依存するすべてのサービス・プロバイダ・インタフェース(SPI)のスーパー・クラスです。
ロケール依存サービス・プロバイダ・インタフェースは、java.textおよびjava.utilパッケージ内のロケール依存クラスに対応するインタフェースです。これらのインタフェースを使えば、これらのパッケージでロケール依存オブジェクトを構築したりローカライズされた名前を取得したりできます。java.textおよびjava.utilパッケージ内のロケールに依存するファクトリ・メソッドや名前取得メソッドは、プロバイダ・インタフェースの実装を使用することで、Java実行環境自体がサポートする一連のロケールに含まれないロケールをサポートします。
特定の具象プロバイダ・クラスが複数の構成ファイル内、または同じ構成ファイル内で繰返し指定されている場合、重複した指定は無視されます。特定のプロバイダを指定した構成ファイルを、プロバイダ自体と同じ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を返した場合、そのロケールがまるでサポートされていなかったかのように、上記で説明したとおりに検索処理が進みます。
JDK8以降、ロケールに依存するサービスの検索順序は、java.locale.providersシステム・プロパティを使用して構成できます。このシステム・プロパティは、ユーザーの優先される、ロケールに依存するサービスの検索順序をカンマで区切って宣言します。これは、Javaランタイムの起動時にのみ読み取られるため、後でSystem.setProperty()を呼び出しても順序に影響しません。
たとえば、プロパティに次が指定されている場合:
java.locale.providers=SPI,JREここで、「SPI」はインストールされているSPIプロバイダに実装されているロケールに依存するサービスを表し、「JRE」はJava Runtime Environmentのロケールに依存するサービスを表し、SPIプロバイダのロケールに依存するサービスが最初に検索されます。
ほかに2つの可能なロケールに依存するサービス・プロバイダ、つまりUnicode ConsortiumのCLDR Projectに基づいたプロバイダである「CLDR」と、基盤となるオペレーティング・システムのユーザーのカスタム設定を反映するプロバイダである「HOST」があります。これらの2つのプロバイダは、Java Runtime Environmentの実装によっては使用できない場合があります。「JRE,SPI」を指定することは、デフォルトの動作と等しく、以前のリリースと互換性があります。
| 修飾子 | コンストラクタと説明 |
|---|---|
protected |
LocaleServiceProvider()
唯一のコンストラクタです。
|
| 修飾子と型 | メソッドと説明 |
|---|---|
abstract Locale[] |
getAvailableLocales()
このロケール・サービス・プロバイダがローカライズ済みのオブジェクトや名前を提供可能な、すべてのロケールを含む配列を返します。
|
boolean |
isSupportedLocale(Locale locale)
指定された
localeがこのロケール・サービス・プロバイダでサポートされる場合はtrueを返します。 |
protected LocaleServiceProvider()
public abstract Locale[] getAvailableLocales()
DateFormat.getAvailableLocales()など、ロケールに依存するサービスのgetAvailableLocales()値を構成するために使用されます。
このメソッドによって返される配列には、拡張だけが異なる複数のLocaleオブジェクトを含めないでください。
public boolean isSupportedLocale(Locale locale)
localeがこのロケール・サービス・プロバイダでサポートされる場合はtrueを返します。指定されたlocaleには、サポートの判断で考慮すべき拡張が含まれることがあります。
指定されたlocaleと使用可能なロケールの両方のすべての拡張を無視して、指定されたlocaleが、getAvailableLocales()によって返される使用可能ないずれかのLocaleに等しい場合、デフォルトの実装はtrueを返します。具象ロケール・サービス・プロバイダ実装がLocale拡張対応である場合、それらの実装ではこのメソッドをオーバーライドしてください。たとえば、DecimalFormatSymbolsProvider実装では、指定されたlocaleの拡張をチェックし、番号付けシステムが指定されていて、サポートできるかどうかを確認する必要があります。 ただし、CollatorProvider実装は、特定の番号付けシステムに影響を受けないことがあり、その場合は、番号付けシステムの拡張を無視してください。
locale - テストするLocalelocaleがこのプロバイダでサポートされる場合はtrueを返し、それ以外の場合はfalseを返します。NullPointerException - 指定されたlocaleがnullの場合Locale.hasExtensions(), Locale.stripExtensions() バグまたは機能を送信
詳細なAPIリファレンスおよび開発者ドキュメントについては、Java SEのドキュメントを参照してください。そのドキュメントには、概念的な概要、用語の定義、回避方法、有効なコード例などの、開発者を対象にしたより詳細な説明が含まれています。
Copyright© 1993, 2014, Oracle and/or its affiliates. All rights reserved.