public abstract class ResourceBundle extends Object
Stringなどのロケール固有のリソースが必要なときは、現在のユーザーのロケールに合ったリソース・バンドルからロードできます。このように、リソース・バンドルから、ロケール固有の情報のすべてでなくてもその大部分を切り離すことで、ユーザーのロケールにはほとんど依存しないプログラム・コードを書くことができます。
これにより、以下の特徴を持つプログラムを書くことが可能になります。
リソース・バンドルはファミリに属しています。そのファミリでは、メンバーは共通の基底名を共有していますが、ファミリ名にはロケールを識別する追加コンポーネントも含まれています。たとえば、リソース・バンドルのファミリの基底名は「MyResources」です。ファミリは、ファミリと同じ名前(MyResources)で、特定のロケールがサポートされない場合は、最後の手段のバンドルとして使用される、デフォルトのリソース・バントルを持つ必要があります。また、ファミリは、必要なだけの数のロケール固有のメンバーを提供することができます。たとえば、「MyResources_de」と名付けられたドイツのメンバーなどです。
ファミリの各リソース・バンドルには同じ項目がありますが、こうした項目は当該リソース・バンドルにより表されるロケールに合わせて翻訳されています。たとえば、「MyResources」と「MyResources_de」の両方に、操作を取り消すためのボタンで使用されるStringがあるとします。そのStringに、「MyResources」では「Cancel」を格納し、「MyResources_de」では「Abbrechen」を格納することができます。
同じ言語を使用するロケールでも国によってリソースが異なるときは、特殊化が可能です。たとえば、「MyResources_de_CH」には、スイス(CH)系のドイツ語(de)のオブジェクトが含まれています。リソースの一部だけを修正することもできます。
プログラムでロケール固有のオブジェクトが必要なときは、getBundleメソッドを使用してResourceBundleクラスをロードします。
ResourceBundle myResources =
ResourceBundle.getBundle("MyResources", currentLocale);
リソース・バンドルは、キーと値のペアになっています。キーは、バンドルのロケール固有のオブジェクトを一意に識別します。キーと値の2つのペアが含まれているListResourceBundleの例を示します。
public class MyResources extends ListResourceBundle {
protected Object[][] getContents() {
return new Object[][] {
// LOCALIZE THE SECOND STRING OF EACH ARRAY (e.g., "OK")
{"OkKey", "OK"},
{"CancelKey", "Cancel"},
// END OF MATERIAL TO LOCALIZE
};
}
}
キーは常にStringです。この例では、キーは「OkKey」と「CancelKey」です。前述した例では、値「OK」と「Cancel」もStringですが、必ずしもそうである必要はありません。値は、どの型のオブジェクトでも可能です。
リソース・バンドルから適切なgetterメソッドを使用してオブジェクトを検索します。「OkKey」と「CancelKey」はどちらも文字列なので、取得にはgetStringを使用します。
button1 = new Button(myResources.getString("OkKey"));
button2 = new Button(myResources.getString("CancelKey"));
getterメソッドは、すべて引数としてキーを要求し、検出したオブジェクトを返します。オブジェクトが見つからない場合、getterメソッドはMissingResourceExceptionをスローします。
getString以外に、ResourceBundleでは、文字列配列を取得するgetStringArrayメソッドも提供します。同様に、ほかの型のオブジェクトを取得するジェネリックgetObjectメソッドも提供します。getObjectを使用する場合、結果を適切な型にキャストする必要があります。たとえば、
int[] myIntegers = (int[]) myResources.getObject("intList");
Javaプラットフォームでは、ResourceBundleの2つのサブクラスListResourceBundleおよびPropertyResourceBundleが用意されています。これらはリソースを作成するかなり簡単な方法を提供します。前の例で簡単に示したように、ListResourceBundleはそのリソースをキー/値ペアのリストとして管理します。PropertyResourceBundleはプロパティ・ファイルを使用してそのリソースを管理します。
ListResourceBundleまたはPropertyResourceBundleでは不十分なときは、独自のResourceBundleサブクラスを書くことができます。サブクラスでオーバーライドしなければいけないメソッドは2つあります。handleGetObjectおよびgetKeys()。
ResourceBundleサブクラスの実装は、複数のスレッドで同時に使用される場合はスレッドセーフである必要があります。このクラスの非抽象メソッドのデフォルト実装と、直系の既知の具象サブクラスListResourceBundleおよびPropertyResourceBundleのメソッドはスレッドセーフです。
ResourceBundle.Controlクラスは、ResourceBundle.Controlインスタンスを取るgetBundleファクトリ・メソッドがバンドル・ロード処理を実行する際に必要とする情報を提供します。ユーザー独自のサブクラスを実装すれば、標準以外のリソース・バンドル形式を利用できるようにしたり、検索手順を変更したり、キャッシュ・パラメータを定義したりできます。詳細については、そのクラスとgetBundleファクトリ・メソッドの説明を参照してください。
ResourceBundle.Controlインスタンスを取らないgetBundleファクトリ・メソッドの場合、インストール済ResourceBundleControlProvider実装を使用してリソース・バンドル・ロードのデフォルト動作を変更できます。すべてのインストール済プロバイダはResourceBundleクラス・ロード時に検出されます。指定されたベース名のResourceBundle.Controlをいずれかのプロバイダが提供する場合、そのResourceBundle.ControlはデフォルトResourceBundle.Controlのかわりに使用されます。同じベース名をサポートするために複数のサービス・プロバイダがインストールされている場合、ServiceLoaderから返される最初のサービス・プロバイダが使用されます。
getBundleファクトリ・メソッドによって作成されたリソース・バンドル・インスタンスはデフォルトでキャッシュされ、ファクトリ・メソッドは同じリソース・バンドル・インスタンス(キャッシュされている場合)を複数回返します。getBundleクライアントは、キャッシュをクリアしたり、有効期間値を使ってキャッシュされたリソース・バンドル・インスタンスの寿命を管理したり、リソース・バンドル・インスタンスをキャッシュしないことを指定したりできます。詳細については、getBundleファクトリ・メソッド、clearCache、ResourceBundle.Control.getTimeToLiveおよびResourceBundle.Control.needsReloadの説明を参照してください。
ResourceBundleのサブクラスMyResourcesの非常に簡単な例です。このサブクラスは2つのリソースを管理します(サブクラスが多数のリソースを管理する場合は、Mapを使用する)。「親レベル」のResourceBundleが、(下記のokKeyのように)同じ値を持つ同じキーを扱う場合は、値を提供する必要はありません。
// default (English language, United States)
public class MyResources extends ResourceBundle {
public Object handleGetObject(String key) {
if (key.equals("okKey")) return "Ok";
if (key.equals("cancelKey")) return "Cancel";
return null;
}
public Enumeration<String> getKeys() {
return Collections.enumeration(keySet());
}
// Overrides handleKeySet() so that the getKeys() implementation
// can rely on the keySet() value.
protected Set<String> handleKeySet() {
return new HashSet<String>(Arrays.asList("okKey", "cancelKey"));
}
}
// German language
public class MyResources_de extends MyResources {
public Object handleGetObject(String key) {
// don't need okKey, since parent level handles it.
if (key.equals("cancelKey")) return "Abbrechen";
return null;
}
protected Set<String> handleKeySet() {
return new HashSet<String>(Arrays.asList("cancelKey"));
}
}
ResourceBundleの単一のファミリだけを使用する必要はありません。たとえば、例外メッセージExceptionResources (ExceptionResources_fr、ExceptionResources_deなど)で1つ、ウィジェットWidgetResource (WidgetResources_fr、WidgetResources_deなど)で1つというように、好きなようにリソースを分割してバンドルのセットを持つこともできます。ListResourceBundle, PropertyResourceBundle, MissingResourceException| 修飾子と型 | クラスと説明 |
|---|---|
static class |
ResourceBundle.Control
ResourceBundle.Controlは、バンドル・ロード処理中にResourceBundle.getBundleファクトリによって呼び出される一連のコールバック・メソッドを定義します。 |
| 修飾子と型 | フィールドと説明 |
|---|---|
protected ResourceBundle |
parent
このバンドルの親バンドル。
|
| コンストラクタと説明 |
|---|
ResourceBundle()
唯一のコンストラクタです。
|
| 修飾子と型 | メソッドと説明 |
|---|---|
static void |
clearCache()
呼出し元のクラス・ローダーを使ってロードされたリソース・バンドルのすべてを、キャッシュから削除します。
|
static void |
clearCache(ClassLoader loader)
指定されたクラス・ローダーを使ってロードされたリソース・バンドルのすべてを、キャッシュから削除します。
|
boolean |
containsKey(String key)
指定された
keyがこのResourceBundleまたはその親バンドル内に含まれるかどうかを判定します。 |
String |
getBaseBundleName()
既知の場合はこのバンドルのベース名を返します。不明の場合は
nullを返します。 |
static ResourceBundle |
getBundle(String baseName)
指定された基底名、デフォルトのロケール、および呼出し側のクラス・ローダーを使用して、リソース・バンドルを取得します。
|
static ResourceBundle |
getBundle(String baseName, Locale locale)
指定された基底名、ロケール、および呼出し側のクラス・ローダーを使用して、リソース・バンドルを取得します。
|
static ResourceBundle |
getBundle(String baseName, Locale locale, ClassLoader loader)
指定された基底名、ロケール、クラス・ローダーを使用して、リソース・バンドルを取得します。
|
static ResourceBundle |
getBundle(String baseName, Locale targetLocale, ClassLoader loader, ResourceBundle.Control control)
指定された基底名、ターゲット・ロケール、クラス・ローダー、およびコントロールを使用して、リソース・バンドルを返します。
|
static ResourceBundle |
getBundle(String baseName, Locale targetLocale, ResourceBundle.Control control)
指定された基底名、ターゲット・ロケール、コントロール、および呼出し側のクラス・ローダーを使用して、リソース・バンドルを返します。
|
static ResourceBundle |
getBundle(String baseName, ResourceBundle.Control control)
指定された基底名、デフォルトのロケール、および指定されたコントロールに基づいて、リソース・バンドルを返します。
|
abstract Enumeration<String> |
getKeys()
キーのリストを返します。
|
Locale |
getLocale()
リソース・バンドルのLocaleを返します。
|
Object |
getObject(String key)
このリソース・バンドルまたはその親リソース・バンドルのいずれかから指定されたキーのオブジェクトを取得します。
|
String |
getString(String key)
このリソース・バンドルまたはその親リソース・バンドルのいずれかから指定されたキーの文字列を取得します。
|
String[] |
getStringArray(String key)
このリソース・バンドルまたはその親リソース・バンドルのいずれかから指定されたキーの文字列配列を取得します。
|
protected abstract Object |
handleGetObject(String key)
このリソース・バンドルから指定されたキーのオブジェクトを取得します。
|
protected Set<String> |
handleKeySet()
この
ResourceBundleにのみ含まれるキーのSetを返します。 |
Set<String> |
keySet()
この
ResourceBundleとその親バンドル内に含まれるすべてのキーのSetを返します。 |
protected void |
setParent(ResourceBundle parent)
このバンドルの親バンドルを設定します。
|
protected ResourceBundle parent
getObjectによって検索されます。public ResourceBundle()
public String getBaseBundleName()
nullを返します。nullでない場合、これは、リソース・バンドルがロードされたときにResourceBundle.getBundle(...)メソッドに渡されたbaseNameパラメータの値です。ResourceBundle.getBundle(...)メソッドに渡され、このメソッドが予期する、リソース・バンドルのベース名。getBundle(java.lang.String, java.util.Locale, java.lang.ClassLoader)public final String getString(String key)
(String) getObject(key).
key - 目的の文字列のキーNullPointerException - keyがnullである場合MissingResourceException - 指定されたキーのオブジェクトが見つからない場合ClassCastException - 指定されたキーの見つかったオブジェクトが文字列でない場合public final String[] getStringArray(String key)
(String[]) getObject(key).
key - 目的の文字列配列のキーNullPointerException - keyがnullである場合MissingResourceException - 指定されたキーのオブジェクトが見つからない場合ClassCastException - 指定されたキーの見つかったオブジェクトが文字列配列でない場合public final Object getObject(String key)
handleGetObjectを使用して、このリソース・バンドルからオブジェクトを取得しようとします。失敗した場合、親リソース・バンドルがnullでないときは、親のgetObjectメソッドを呼び出します。それでも取得できない場合は、MissingResourceExceptionをスローします。key - 目的のオブジェクトのキーNullPointerException - keyがnullである場合MissingResourceException - 指定されたキーのオブジェクトが見つからない場合public Locale getLocale()
protected void setParent(ResourceBundle parent)
getObjectによって検索されます。parent - このバンドルの親バンドル。public static final ResourceBundle getBundle(String baseName)
getBundle(baseName, Locale.getDefault(), this.getClass().getClassLoader()),
getClassLoader()が、ResourceBundleのセキュリティ特権により実行されることだけが異なります。検索とインスタンス化の方法の詳細は、getBundleを参照してください。baseName - リソース・バンドルの基底名。完全指定クラス名NullPointerException - baseNameがnullである場合MissingResourceException - 指定された基底名のリソース・バンドルが見つからない場合public static final ResourceBundle getBundle(String baseName, ResourceBundle.Control control)
getBundle(baseName, Locale.getDefault(),
this.getClass().getClassLoader(), control),
getClassLoader()が、ResourceBundleのセキュリティ特権により実行されることだけが異なります。ResourceBundle.Controlを使用したリソース・バンドル・ロード処理の詳細は、getBundleを参照してください。baseName - リソース・バンドルの基底名。完全指定クラス名control - リソース・バンドル・ロード処理のための情報を提供するコントロールNullPointerException - baseNameまたはcontrolがnullである場合MissingResourceException - 指定された基底名のリソース・バンドルが見つからない場合IllegalArgumentException - 指定されたcontrolが正しく実行されない場合(たとえば、control.getCandidateLocalesがnullを返す場合)。controlの検証が必要に応じて実行されることに注意。public static final ResourceBundle getBundle(String baseName, Locale locale)
getBundle(baseName, locale, this.getClass().getClassLoader()),
getClassLoader()が、ResourceBundleのセキュリティ特権により実行されることだけが異なります。検索とインスタンス化の方法の詳細は、getBundleを参照してください。baseName - リソース・バンドルの基底名。完全指定クラス名locale - リソース・バンドルが必要なロケールNullPointerException - baseNameまたはlocaleがnullである場合MissingResourceException - 指定された基底名のリソース・バンドルが見つからない場合public static final ResourceBundle getBundle(String baseName, Locale targetLocale, ResourceBundle.Control control)
getBundle(baseName, targetLocale, this.getClass().getClassLoader(),
control),
getClassLoader()が、ResourceBundleのセキュリティ特権により実行されることだけが異なります。ResourceBundle.Controlを使用したリソース・バンドル・ロード処理の詳細は、getBundleを参照してください。baseName - リソース・バンドルの基底名。完全指定クラス名targetLocale - リソース・バンドルが必要なロケールcontrol - リソース・バンドル・ロード処理のための情報を提供するコントロールlocales内のあるLocaleに対するリソース・バンドルNullPointerException - baseName、locales、またはcontrolがnullの場合MissingResourceException - locales内のどのロケールにおいても指定された基底名のリソース・バンドルが見つからない場合。IllegalArgumentException - 指定されたcontrolが正しく実行されない場合(たとえば、control.getCandidateLocalesがnullを返す場合)。controlの検証が必要に応じて実行されることに注意。public static ResourceBundle getBundle(String baseName, Locale locale, ClassLoader loader)
このメソッドは、別のResourceBundle.ControlがResourceBundleControlProvider SPIによって提供される場合を除いて、ResourceBundle.Controlのデフォルト・インスタンスを渡してgetBundle(String, Locale, ClassLoader, Control)を呼び出す場合と同様に動作します。デフォルト動作の変更の説明を参照してください。
getBundleは、基底名、指定されたロケール、およびデフォルトのロケール(Locale.getDefaultから取得される)を使用して、候補のバンドル名のシーケンスを生成します。指定されたロケールの言語、スクリプト、国、およびバリアントがすべて空の文字列の場合、候補のバンドル名は基底名のみになります。それ以外の場合は、指定されたロケールの属性値(言語、スクリプト、国、およびバリアント)から候補ロケールのリストが生成され、基底名に追加されます。通常、これは次のようになります。
baseName + "_" + language + "_" + script + "_" + country + "_" + variant
baseName + "_" + language + "_" + script + "_" + country
baseName + "_" + language + "_" + script
baseName + "_" + language + "_" + country + "_" + variant
baseName + "_" + language + "_" + country
baseName + "_" + language
最終コンポーネントとして空の文字列を持つ候補のバンドル名は、下線とともに省略されます。たとえば、国が空の文字列の場合、上記のうち2番目と5番目の候補のバンドル名は省略されます。また、スクリプトが空の文字列の場合、スクリプトを含む候補名は省略されます。たとえば、ロケールの言語が「de」、バリアントが「JAVA」の場合は、基底名「MyResource」を使用して次の候補名が生成されます。
MyResource_de__JAVA
MyResource_de
バリアントに1つ以上の下線(「_」)が含まれている場合は、最後の下線とそれに続く部分を切り捨てることによってバンドル名のシーケンスが生成され、元のバリアントを持つ候補バンドル名のあとに挿入されます。たとえば、ロケールの言語が「en」、スクリプトが「Latn」、国が「US」、バリアントが「WINDOWS_VISTA」で、バンドルの基底名が「MyResource」の場合は、次の候補バンドル名のリストが生成されます。
MyResource_en_Latn_US_WINDOWS_VISTA MyResource_en_Latn_US_WINDOWS MyResource_en_Latn_US MyResource_en_Latn MyResource_en_US_WINDOWS_VISTA MyResource_en_US_WINDOWS MyResource_en_US MyResource_en
注: 一部のLocaleでは、候補のバンドル名のリストにほかの名前も含まれている場合や、バンドル名の順序が多少異なる場合があります。詳細は、getCandidateLocalesのデフォルト実装の説明を参照してください。
getBundleは実際のリソース・バンドルをインスタンス化できる最初の名前を見つけるために、候補のバンドル名を反復処理します。デフォルトコントロールのgetFormatsメソッドを使用します。これは、生成される名前ごとに2つのバンドル名を生成します。1つ目はクラス名、2つ目はプロパティ・ファイル名です。候補バンドル名ごとに、リソース・バンドルを次のように作成しようとします。
getBundleはこのクラスの新しいインスタンスを作成して、結果リソース・バンドルとしてそのインスタンスを使用します。
getBundleは生成されたプロパティ・ファイル名を使用してプロパティ・リソース・ファイルを見つけようとします。すべての「.」文字を「/」文字に置き換え、「.properties」文字列を追加して、候補のバンドル名からパス名を生成します。ClassLoader.getResourceを使ってこの名前を持つ「リソース」の検索を試みます。(getResourceにおける「リソース」は、リソース・バンドルの内容とはまったく関係なく、ファイルなどのデータ・コンテナにすぎないことに注意。)「リソース」を見つけた場合、リソースの内容から新しいPropertyResourceBundleインスタンスを作成しようとします。成功した場合は、このインスタンスは、結果リソース・バンドルになります。 結果リソース・バンドルがインスタンス化されるか、候補バンドル名のリストが終わるまで、これが繰り返されます。一致するリソース・バンドルが見つからない場合は、デフォルトのコントロールのgetFallbackLocaleメソッドが呼び出されて、現在のデフォルト・ロケールが返されます。このロケールを使用して候補ロケール名の新しいシーケンスが生成され、それが上記のように再度検索されます。
それでもなお結果バンドルが見つからない場合は、単独の基底名が検索されます。これも失敗した場合は、MissingResourceExceptionがスローされます。
結果リソース・バンドルが見つかったときは、その親チェーンがインスタンス化されます。結果バンドルにすでに親が存在している場合(おそらくキャッシュから返されたため)、連鎖は完成します。
それ以外の場合、getBundleは、結果リソース・バンドルが生成されたパスで使用された候補ロケール・リストの残り部分を調べます。(前述したように、最終コンポーネントが空の文字列である場合、候補のバンドル名は省略されます。)候補リストの終わりに到達した場合は、単純なバンドル名を試します。候補のバンドル名ごとに、リソース・バンドルのインスタンス化を試みます(前述したように、まずクラスを検索し、次にプロパティ・ファイルを検索します)。
それが成功するたびに、前にインスタンス化したリソース・バンドルのsetParentメソッドを新しいリソース・バンドルで呼び出します。名前のリストが終わるまで、または現在のバンドルにnull以外の親がまだ存在していないかぎり、これが繰り返されます。
親連鎖が完成したら、バンドルが返されます。
注: getBundleは、インスタンス化したリソース・バンドルをキャッシュし、同じリソース・バンドルのインスタンスを複数回返す可能性があります。
注: baseName引数は完全指定されたクラス名である必要があります。ただし、以前のバージョンとの互換性を保つために、SunのJava SE Runtime Environmentはそのことを検証しません。そのため、完全指定されたクラス名(「.」を使用)の代わりにパス名(「/」を使用)を指定して、PropertyResourceBundleにアクセスすることができます。
次のクラスとプロパティ・ファイルが提供されています。
MyResources.class
MyResources.properties
MyResources_fr.properties
MyResources_fr_CH.class
MyResources_fr_CH.properties
MyResources_en.properties
MyResources_es_ES.class
すべてのファイルの内容が有効です(つまり、「.class」ファイルはResourceBundleのpublic非抽象サブクラスを含んでおり、「.properties」ファイルは構文的に正しい)。デフォルトのロケールはLocale("en", "GB")です。
getBundleを次の引数で呼び出すと、リソース・バンドルが次のようにインスタンス化されます。
| Locale("fr", "CH") | MyResources_fr_CH.class, parent MyResources_fr.properties, parent MyResources.class |
| Locale("fr", "FR") | MyResources_fr.properties, parent MyResources.class |
| Locale("de", "DE") | MyResources_en.properties, parent MyResources.class |
| Locale("en", "US") | MyResources_en.properties, parent MyResources.class |
| Locale("es", "ES") | MyResources_es_ES.class, parent MyResources.class |
ファイルMyResources_fr_CH.propertiesはMyResources_fr_CH.classによって隠されるため、使用されません。同様に、MyResources.propertiesもMyResources.classによって隠されます。
baseName - リソース・バンドルの基底名。完全指定クラス名locale - リソース・バンドルが必要なロケールloader - リソース・バンドルのロード元のクラス・ローダーNullPointerException - baseName、locale、またはloaderがnullの場合MissingResourceException - 指定された基底名のリソース・バンドルが見つからない場合public static ResourceBundle getBundle(String baseName, Locale targetLocale, ClassLoader loader, ResourceBundle.Control control)
control引数のないgetBundleファクトリ・メソッドとは異なり、指定されたcontrolによって、リソース・バンドルを検索およびインスタンス化する方法が決まります。基本的に、controlが指定された場合のバンドル・ロード処理の実行手順は、次のようになります。
baseName、targetLocale、およびloaderに対するリソース・バンドルを、キャッシュ内で検索します。要求されたリソース・バンドルのインスタンスがキャッシュ内で見つかり、そのインスタンスとすべての親インスタンスの有効期間がまだ過ぎていない場合には、そのインスタンスが呼出し元に返されます。それ以外の場合、このファクトリ・メソッドは次のロード処理へと進みます。control.getFormatsメソッドが呼び出され、リソース・バンドル形式が取得されます。文字列"java.class"と"java.properties"はそれぞれ、クラス・ベースのリソース・バンドルとプロパティベースのリソース・バンドルを表します。"java."で始まるその他の文字列は、将来の拡張用として予約されているため、アプリケーション定義形式では使用しないでください。その他の文字列は、アプリケーション定義形式を表します。control.getCandidateLocalesメソッドがターゲット・ロケールを指定して呼び出され、リソース・バンドルの検索に使用される候補Localeのリストが取得されます。control.newBundleメソッドが呼び出され、この基底バンドル名、ある候補ロケール、およびある形式に対するResourceBundleがインスタンス化されます。(後述のキャッシュ検索に関する注を参照。)この手順は候補ロケールと形式のすべての組み合わせについて反復され、newBundleメソッドがResourceBundleインスタンスを返すかすべての組み合わせが使用された時点で終了します。たとえば、候補ロケールがLocale("de", "DE")、Locale("de")、およびLocale("")であり、形式が"java.class"と"java.properties"であった場合、control.newBundleの呼出し時に使用すべきロケールと形式の組み合わせのシーケンスは、次のようになります。
ロケール |
フォーマット |
Locale("de", "DE") |
java.class |
Locale("de", "DE") |
java.properties |
Locale("de") |
java.class |
Locale("de") |
java.properties |
Locale("") |
java.class |
Locale("") |
java.properties |
Locale("")に対するバンドル)であり、候補ロケール・リストにLocale("")しか含まれていなかった場合には、そのバンドルを呼出し元に返します。見つかったバンドルが基底バンドルであるが、候補ロケール・リストにLocale("")以外のロケールが含まれていた場合には、そのバンドルを保留して手順6に進みます。見つかったバンドルが基底バンドルでない場合は、手順7に進みます。control.getFallbackLocaleメソッドが呼び出され、フォール・バック・ロケール(現在のターゲット・ロケールの代替となるロケール)が取得されます。このメソッドがnull以外のロケールを返した場合、それが次のターゲット・ロケールとなり、手順3からロード処理が開始されます。それ以外の場合、1つ前の手順5で基底バンドルが見つかり、それを保留していた場合には、その基底バンドルがこの時点で呼出し元に返されます。それ以外の場合は、MissingResourceExceptionがスローされます。前述のリソース・バンドル・ロード処理の間、このファクトリ・メソッドはcontrol.newBundleメソッドを呼び出す前にキャッシュをルックアップします。キャッシュ内で見つかったリソース・バンドルの有効期間が期限切れの場合、ファクトリ・メソッドはcontrol.needsReloadメソッドを呼び出し、リソース・バンドルを再ロードする必要があるかどうかを判定します。再ロードが必要な場合、ファクトリ・メソッドはcontrol.newBundleを呼び出してリソース・バンドルを再ロードします。control.newBundleがnullを返した場合、ファクトリ・メソッドは、存在しないリソース・バンドルの目印として、ダミーのリソース・バンドルをキャッシュ内に格納します。これにより、後続の要求に対する検索オーバーヘッドを回避できます。そのようなダミーのリソース・バンドルは、controlで指定されたのと同じ有効期限制御下に入ります。
デフォルトでは、ロードされたリソース・バンドルのすべてがキャッシュに格納されます。詳細は、control.getTimeToLiveを参照してください。
デフォルトのResourceBundle.Control実装を使用したバンドル・ロード処理の例を、次に示します。
条件:
foo.bar.Messages
Locale: Locale.ITALYLocale: Locale.FRENCHfoo/bar/Messages_fr.propertiesおよびfoo/bar/Messages.propertiesまず、getBundleは、次の順番でリソース・バンドルのロードを試みます。
foo.bar.Messages_it_IT
foo/bar/Messages_it_IT.properties
foo.bar.Messages_itfoo/bar/Messages_it.propertiesfoo.bar.Messagesfoo/bar/Messages.propertiesこの時点で、getBundleはfoo/bar/Messages.propertiesを見つけます。これは、ベース・バンドルなので保留にされます。getBundleはcontrol.getFallbackLocale("foo.bar.Messages", Locale.ITALY)を呼び出します。Locale.FRENCHが返されます。次に、getBundleは次の順番でバンドルのロードを試みます。
foo.bar.Messages_frfoo/bar/Messages_fr.propertiesfoo.bar.Messagesfoo/bar/Messages.propertiesgetBundleはfoo/bar/Messages_fr.propertiesを見つけ、ResourceBundleインスタンスを作成します。次に、getBundleは候補ロケールのリストからその親チェーンを設定します。リスト内で見つかるのはfoo/bar/Messages.propertiesだけです。getBundleは、foo/bar/Messages_fr.propertiesに対するインスタンスの親になるResourceBundleインスタンスを作成します。
baseName - リソース・バンドルの基底名。完全指定クラス名targetLocale - リソース・バンドルが必要なロケールloader - リソース・バンドルのロード元のクラス・ローダーcontrol - リソース・バンドル・ロード処理のための情報を提供するコントロールNullPointerException - baseName、targetLocale、loader、またはcontrolがnullの場合MissingResourceException - 指定された基底名のリソース・バンドルが見つからない場合IllegalArgumentException - 指定されたcontrolが正しく実行されない場合(たとえば、control.getCandidateLocalesがnullを返す場合)。controlの検証が必要に応じて実行されることに注意。public static final void clearCache()
ResourceBundle.Control.getTimeToLive(String,Locale)public static final void clearCache(ClassLoader loader)
loader - クラス・ローダーNullPointerException - loaderがnullである場合ResourceBundle.Control.getTimeToLive(String,Locale)protected abstract Object handleGetObject(String key)
key - 目的のオブジェクトのキーNullPointerException - keyがnullである場合public abstract Enumeration<String> getKeys()
ResourceBundleとその親バンドル内に含まれるキーのEnumeration。public boolean containsKey(String key)
keyがこのResourceBundleまたはその親バンドル内に含まれるかどうかを判定します。key - リソースのkeykeyがこのResourceBundleまたはその親バンドル内に含まれる場合はtrue、それ以外の場合はfalse。NullPointerException - keyがnullである場合public Set<String> keySet()
ResourceBundleとその親バンドル内に含まれるすべてのキーのSetを返します。ResourceBundleとその親バンドル内に含まれるすべてのキーのSet。protected Set<String> handleKeySet()
ResourceBundleにのみ含まれるキーのSetを返します。
デフォルト実装は、getKeysメソッドによって返されるキーのSetを返します(handleGetObjectメソッドがnullを返すものを除く)。Setが作成されると、その値がこのResourceBundle内に保存されます。これにより、次の呼出し時に同じSetが生成されるのを防ぐことができます。サブクラスはこのメソッドをオーバーライドして、処理の高速化を図ることができます。
ResourceBundleにのみ含まれているキーのSet バグまたは機能を送信
詳細なAPIリファレンスおよび開発者ドキュメントについては、Java SEのドキュメントを参照してください。そのドキュメントには、概念的な概要、用語の定義、回避方法、有効なコード例などの、開発者を対象にしたより詳細な説明が含まれています。
Copyright© 1993, 2014, Oracle and/or its affiliates. All rights reserved.