public static class ResourceBundle.Control extends Object
ResourceBundle.Controlは、バンドル・ロード処理中にResourceBundle.getBundleファクトリによって呼び出される一連のコールバック・メソッドを定義します。つまり、ResourceBundle.Controlは、リソース・バンドルのロード時にファクトリ・メソッドと連携して動作します。コールバック・メソッドのデフォルト実装は、ファクトリ・メソッドがデフォルト動作を実行するために必要な情報を提供します。
コールバック・メソッドの他に、toBundleNameおよびtoResourceNameメソッドが、主にコールバック・メソッドの実装を支援するために定義されています。ただし、toBundleNameメソッドをオーバーライドすれば、ローカライズ済みリソースの構成やパッケージ化に関する異なる規約を提供できます。toResourceNameメソッドがfinalになっているのは、リソース名やクラス名の区切り文字の誤用を回避するためです。
2つのファクトリ・メソッドgetControl(List)とgetNoFallbackControl(List)は、デフォルトのバンドル・ロード処理の一般的なバリエーションを実装したResourceBundle.Controlインスタンスを提供します。
getFormatsメソッドから返される形式とgetCandidateLocalesメソッドから返される候補ロケールは、同じ基底バンドルに対するすべてのResourceBundle.getBundle呼出しで一貫性のあるものでなければいけません。そうでないと、ResourceBundle.getBundleメソッドが想定外のバンドルを返す可能性があります。たとえば、ResourceBundle.getBundleの初回呼出し時にgetFormatsメソッドから"java.class"のみが返され、2回目の呼出し時に"java.properties"のみが返された場合、その2回目の呼出しでは、初回呼出し時にキャッシュに格納されたクラス・ベースのバンドルが返されます。
複数のスレッドが同時に使用するResourceBundle.Controlインスタンスは、スレッドセーフでなければいけません。ResourceBundle.getBundleは、ResourceBundle.Controlのメソッドを呼び出す際に同期処理を行いません。これらのメソッドのデフォルト実装はスレッドセーフです。
アプリケーションは、getControlファクトリ・メソッドから返されたResourceBundle.Controlインスタンスを指定することもできますし、ResourceBundle.Controlのサブクラスから作成されたインスタンスを指定してバンドル・ロード処理をカスタマイズすることもできます。デフォルトのバンドル・ロード処理を変更する例を、次に示します。
プログラム例1
次のコードの場合、ResourceBundle.getBundleはプロパティ・ベースのリソースのみを検索します。
import java.util.*;
import static java.util.ResourceBundle.Control.*;
...
ResourceBundle bundle =
ResourceBundle.getBundle("MyResources", new Locale("fr", "CH"),
ResourceBundle.Control.getControl(FORMAT_PROPERTIES));
ResourceBundle.getBundleの説明の例でリソース・バンドルが与えられた場合、このResourceBundle.getBundle呼出しはMyResources_fr_CH.propertiesをロードします(親はMyResources_fr.properties、その親はMyResources.properties)。(MyResources_fr_CH.propertiesは隠されないが、MyResources_fr_CH.classは隠される。)
プログラム例2
Properties.loadFromXMLを使ってXMLベースのバンドルをロードする例を、次に示します。
ResourceBundle rb = ResourceBundle.getBundle("Messages",
new ResourceBundle.Control() {
public List<String> getFormats(String baseName) {
if (baseName == null)
throw new NullPointerException();
return Arrays.asList("xml");
}
public ResourceBundle newBundle(String baseName,
Locale locale,
String format,
ClassLoader loader,
boolean reload)
throws IllegalAccessException,
InstantiationException,
IOException {
if (baseName == null || locale == null
|| format == null || loader == null)
throw new NullPointerException();
ResourceBundle bundle = null;
if (format.equals("xml")) {
String bundleName = toBundleName(baseName, locale);
String resourceName = toResourceName(bundleName, format);
InputStream stream = null;
if (reload) {
URL url = loader.getResource(resourceName);
if (url != null) {
URLConnection connection = url.openConnection();
if (connection != null) {
// Disable caches to get fresh data for
// reloading.
connection.setUseCaches(false);
stream = connection.getInputStream();
}
}
} else {
stream = loader.getResourceAsStream(resourceName);
}
if (stream != null) {
BufferedInputStream bis = new BufferedInputStream(stream);
bundle = new XMLResourceBundle(bis);
bis.close();
}
}
return bundle;
}
});
...
private static class XMLResourceBundle extends ResourceBundle {
private Properties props;
XMLResourceBundle(InputStream stream) throws IOException {
props = new Properties();
props.loadFromXML(stream);
}
protected Object handleGetObject(String key) {
return props.getProperty(key);
}
public Enumeration<String> getKeys() {
...
}
}
| 修飾子と型 | フィールドと説明 |
|---|---|
static List<String> |
FORMAT_CLASS
"java.class"を含む、クラスのみの形式のListです。 |
static List<String> |
FORMAT_DEFAULT
デフォルト形式の
Listであり、文字列"java.class"と"java.properties"をこの順番で含みます。 |
static List<String> |
FORMAT_PROPERTIES
"java.properties"を含む、プロパティのみの形式のListです。 |
static long |
TTL_DONT_CACHE
ロードされたリソース・バンドル・インスタンスをキャッシュしないための有効期間定数。
|
static long |
TTL_NO_EXPIRATION_CONTROL
キャッシュ内のロード済みリソース・バンドル・インスタンスの有効期限制御を無効にするための有効期間定数。
|
| 修飾子 | コンストラクタと説明 |
|---|---|
protected |
Control()
唯一のコンストラクタです。
|
| 修飾子と型 | メソッドと説明 |
|---|---|
List<Locale> |
getCandidateLocales(String baseName, Locale locale)
baseNameとlocaleの候補ロケールとして、LocaleのListを返します。 |
static ResourceBundle.Control |
getControl(List<String> formats)
|
Locale |
getFallbackLocale(String baseName, Locale locale)
ResourceBundle.getBundleファクトリ・メソッドがリソース・バンドルをさらに検索する際のフォール・バック・ロケールとして使用されるLocaleを返します。 |
List<String> |
getFormats(String baseName)
指定された
baseNameのリソース・バンドルをロードする際に使用すべき形式が格納された、StringのListを返します。 |
static ResourceBundle.Control |
getNoFallbackControl(List<String> formats)
|
long |
getTimeToLive(String baseName, Locale locale)
この
ResourceBundle.Controlの下でロードされるリソース・バンドルの有効期間(TTL)値を返します。 |
boolean |
needsReload(String baseName, Locale locale, String format, ClassLoader loader, ResourceBundle bundle, long loadTime)
キャッシュ内で有効期限の切れた
bundleを再ロードする必要があるかどうかを、loadTimeに指定されたロード時刻やその他のいくつかの条件に基づいて判定します。 |
ResourceBundle |
newBundle(String baseName, Locale locale, String format, ClassLoader loader, boolean reload)
指定された形式とロケールを持つ指定されたバンドル名のリソース・バンドルを、指定されたクラス・ローダーを必要に応じて使用してインスタンス化します。
|
String |
toBundleName(String baseName, Locale locale)
指定された
baseNameとlocaleをバンドル名に変換します。 |
String |
toResourceName(String bundleName, String suffix)
指定された
bundleNameをClassLoader.getResourceメソッドで必要とされる形式に変換するため、bundleName内のすべての'.'を'/'に置き換え、末尾に1つの'.'と指定されたファイルsuffixを追加します。 |
public static final List<String> FORMAT_DEFAULT
getFormats(String)public static final List<String> FORMAT_CLASS
getFormats(String)public static final List<String> FORMAT_PROPERTIES
getFormats(String)public static final long TTL_DONT_CACHE
public static final long TTL_NO_EXPIRATION_CONTROL
public static final ResourceBundle.Control getControl(List<String> formats)
getFormatsメソッドが指定されたformatsを返す、ResourceBundle.Controlを返します。formatsは、FORMAT_PROPERTIES、FORMAT_CLASS、またはFORMAT_DEFAULTのいずれかと等しくなる必要があります。このメソッドによって返されるResourceBundle.Controlインスタンスは単独であり、スレッドセーフです。
FORMAT_DEFAULTを指定することは、ResourceBundle.Controlクラスをインスタンス化することと等価です。ただし、このメソッドが単独オブジェクトを返す点だけは異なります。
formats - ResourceBundle.Control.getFormatsメソッドによって返される形式formatsをサポートするResourceBundle.ControlNullPointerException - formatsがnullである場合IllegalArgumentException - formatsが不明な場合public static final ResourceBundle.Control getNoFallbackControl(List<String> formats)
getFormatsメソッドが指定されたformatsを返し、かつgetFallbackLocaleメソッドがnullを返す、ResourceBundle.Controlを返します。formatsは、FORMAT_PROPERTIES、FORMAT_CLASS、またはFORMAT_DEFAULTのいずれかと等しくなる必要があります。このメソッドによって返されるResourceBundle.Controlインスタンスは単独であり、スレッドセーフです。formats - ResourceBundle.Control.getFormatsメソッドによって返される形式formatsをサポートし、フォール・バックLocaleをサポートしないResourceBundle.ControlNullPointerException - formatsがnullである場合IllegalArgumentException - formatsが不明な場合public List<String> getFormats(String baseName)
baseNameのリソース・バンドルをロードする際に使用すべき形式が格納された、StringのListを返します。ResourceBundle.getBundleファクトリ・メソッドは、このリスト内の形式を持つリソース・バンドルを、リスト内に指定された順番でロードしようとします。このメソッドから返されたリストには、少なくとも1つのStringが含まれていなければいけません。定義済みの形式は、クラス・ベースのリソース・バンドル用の"java.class"と、プロパティ・ベースのリソース・バンドル用の"java.properties"です。"java."で始まる文字列は、将来の拡張用として予約されているため、アプリケーション定義形式では使用しないでください。
不変の(変更不可能な) Listを返す必要は、必ずしもありません。ただし、ListがgetFormatsによって返されたあとで、それを変更してはいけません。
デフォルト実装はFORMAT_DEFAULTを返しますが、これは、ResourceBundle.getBundleファクトリ・メソッドがまずクラス・ベースのリソース・バンドルを検索し、次にプロパティ・ベースのバンドルを検索するようにするためです。
baseName - リソース・バンドルの基底名。完全指定クラス名StringのList。NullPointerException - baseNameがnullである場合FORMAT_DEFAULT, FORMAT_CLASS, FORMAT_PROPERTIESpublic List<Locale> getCandidateLocales(String baseName, Locale locale)
baseNameとlocaleの候補ロケールとして、LocaleのListを返します。このメソッドは、ターゲットLocaleのリソース・バンドルの検索をResourceBundle.getBundleファクトリ・メソッドが試みるたびに、そのファクトリ・メソッドによって呼び出されます。
候補ロケールに対応するリソース・バンドルが存在しており、それらのロード済みリソース・バンドル自体には親が定義されていない場合、候補ロケールのシーケンスは、実行時リソース検索パス(親連鎖とも呼ばれる)にも対応します。基底バンドルを親連鎖の終端にする必要がある場合、このリストの最後の要素はルート・ロケールでなければいけません。
指定されたロケールがLocale.ROOT (ルート・ロケール)に等しい場合、ルートのLocaleだけを含むListが返される必要があります。この場合、ResourceBundle.getBundleファクトリ・メソッドは、結果として得られるリソース・バンドルとして基底バンドルだけをロードします。
不変の(変更不可能な) Listを返す必要は、必ずしもありません。ただし、ListがgetCandidateLocalesによって返されたあとで、それを変更してはいけません。
デフォルト実装は、後述のルールを使用して、Localeを含むListを返します。下記の説明で、L、S、C、およびVはそれぞれ、空でない言語、スクリプト、国、およびバリアントを表します。たとえば、[L, C]は、言語と国だけに空でない値を持つLocaleを表します。L("xx")という形式は、(空でない)言語の値が"xx"であることを表します。どの場合でも、最終コンポーネントの値として空の文字列を持つLocaleは省略されます。
Localeのスクリプトの値が空の場合は、次のように最終コンポーネントを1つずつ省略して候補Localeを追加します。
Locale.ROOT Localeのスクリプトの値が空でない場合は、最終コンポーネントを言語まで省略して候補Localeを追加したあと、元の国とバリアントを使用してLocaleから生成した候補を追加します。
Locale.ROOTLocaleが、バリアント値が下線で区切られた複数のサブタグで構成される場合は、バリアント・サブタグを1つずつ省略することで候補Localeを生成してから、元のリスト内でフル・バリアント値を持つすべての Localeオカレンスのあとにそれらを挿入します。たとえば、バリアントが2つのサブタグV1およびV2から成る場合は、次のようになります。
Locale.ROOTLocaleロケールの言語が「zh」(中国語)で、スクリプトの値が空の場合は、国に応じて「Hans」(簡体字)または「Hant」(繁体字)が指定されます。国が「CN」(中国)または「SG」(シンガポール)の場合は、「Hans」が指定されます。国が「HK」(香港特別行政区、中国)、「MO」(マカオ特別行政区、中国)、または「TW」(台湾)の場合は、「Hant」が指定されます。その他の国では、国が空の場合、スクリプトは指定されません。たとえば、Locale("zh", "CN") の場合、候補リストは次のようになります。
Locale.ROOTLocale("zh", "TW")の場合、候補リストは次のようになります。
Locale.ROOTLocale("no", "NO", "NY")とLocale("nn", "NO")はどちらもノルウェー語ニーノシクを表します。ロケールの言語が「nn」の場合、標準の候補リストは[L("nn")]まで生成されたあと、次の候補が追加されます。
Locale.ROOTLocale("no", "NO", "NY")の場合は、まずLocale("nn", "NO")に変換されたあと、上記の処理が行われます。
また、Javaは言語「no」をノルウェー語ブークモール「nb」の同義語として扱います。このLocale("no", "NO", "NY") (上記のように処理される)以外は、入力Localeの言語が「no」または「nb」の場合、言語コード「no」と「nb」を持つ候補Localeが交互に追加されます。まず要求された言語、次にその同義語が使用されます。たとえば、Locale("nb", "NO", "POSIX")では、次の候補リストが生成されます。
Locale.ROOTLocale("no", "NO", "POSIX")でも同じリストが生成されますが、「no」を持つロケールが「nb」を持つロケールより前に出現する点が異なります。デフォルト実装はArrayListを使用しますが、これは、オーバーライドした実装内で、呼出し元に返す前に変更することができます。ただし、getCandidateLocalesから返されたあとでサブクラス内で変更してはいけません。
たとえば、指定されたbaseNameが「Messages」であり、指定されたlocaleがLocale("ja", "", "XX")であった場合、LocaleのList:
Locale("ja", "", "XX")
Locale("ja")
Locale.ROOT
が返されます。そして、「ja」と「」のLocaleに対するリソース・バンドルが見つかった場合、実行時リソース検索パス(親連鎖)は次のようになります。
Messages_ja -> Messages
baseName - リソース・バンドルの基底名。完全指定クラス名locale - リソース・バンドルが必要なロケールlocaleに対する候補LocaleのListNullPointerException - baseNameまたはlocaleがnullである場合public Locale getFallbackLocale(String baseName, Locale locale)
ResourceBundle.getBundleファクトリ・メソッドがリソース・バンドルをさらに検索する際のフォール・バック・ロケールとして使用されるLocaleを返します。このメソッドは、baseNameとlocaleに対応する結果リソース・バンドルが1つも見つからない状況が発生するたびに、ファクトリ・メソッドによって呼び出されます。ここで、そのロケールは、ResourceBundle.getBundleのパラメータ、このメソッドから以前に返されたフォール・バック・ロケールのいずれかになります。
このメソッドは、さらなるフォール・バック検索が必要ない場合にnullを返します。
デフォルト実装は、指定されたlocaleがデフォルトのロケールではない場合にデフォルトのLocaleを返します。それ以外の場合はnullが返されます。
baseName - リソース・バンドルの基底名。完全指定クラス名。ResourceBundle.getBundleはこの基底名に対して、基底バンドル以外のリソース・バンドルを1つも見つけられなかったlocale - Locale。ResourceBundle.getBundleはこのロケールに対して、基底バンドル以外のリソース・バンドルを1つも見つけられなかったLocale。さらなるフォール・バック検索が必要ない場合はnull。NullPointerException - baseNameまたはlocaleがnullである場合public ResourceBundle newBundle(String baseName, Locale locale, String format, ClassLoader loader, boolean reload) throws IllegalAccessException, InstantiationException, IOException
nullを返します。予想外のエラーが発生したためにリソース・バンドルのインスタンス化が行えない場合には、単純にnullを返す代わりに、ErrorまたはExceptionをスローすることでエラーを報告する必要があります。
reloadフラグがtrueの場合、それは、以前にロードされたリソース・バンドルの有効期限が切れたためにこのメソッドが呼び出されたことを示します。
デフォルト実装によるResourceBundleのインスタンス化手順は、次のとおりです。
toBundleName(baseName, locale)を呼び出すことでバンドル名が取得される。formatが"java.class"の場合、バンドル名によって指定されるClassが、ClassLoader.loadClass(String)を呼び出すことでロードされる。次に、Class.newInstance()を呼び出すことでResourceBundleがインスタンス化される。なお、このデフォルト実装では、クラス・ベースのリソース・バンドルをロードする際にはreloadフラグが無視される。formatが"java.properties"の場合、toResourceName(bundlename, "properties")を呼び出すことでリソース名が取得される。reloadがtrueの場合、load.getResourceを呼び出すことで、URLConnectionを作成するためのURLが取得される。このURLConnectionを使って、基盤となるリソース・ロード処理層のキャッシュの無効化と、InputStreamの取得が行われる。それ以外の場合は、loader.getResourceAsStreamを呼び出すことでInputStreamが取得される。次に、そのInputStreamを使ってPropertyResourceBundleが構築される。formatが"java.class"でも"java.properties"でもない場合は、IllegalArgumentExceptionがスローされる。baseName - リソース・バンドルの基底バンドル名。完全指定クラス名locale - リソース・バンドルのインスタンス化対象となるロケールformat - ロードされるリソース・バンドルの形式loader - バンドルをロードするために使用するClassLoaderreload - バンドルの再ロードを示すフラグ。有効期限の切れたリソース・バンドルを再ロードする場合はtrue、それ以外の場合はfalsenull。NullPointerException - bundleName、locale、format、またはloaderがnullの場合、またはtoBundleNameからnullが返された場合IllegalArgumentException - formatが不明である場合、または指定されたパラメータに対して見つかったリソースに不正なデータが含まれている場合。ClassCastException - ロードされたクラスをResourceBundleにキャストできない場合IllegalAccessException - クラスまたはその引数なしのコンストラクタにアクセスできない場合。InstantiationException -クラスのインスタンス化が何かほかの理由で失敗する場合。ExceptionInInitializerError - このメソッドによる初期化に失敗した場合。SecurityException - セキュリティ・マネージャが存在し、新しいインスタンスの作成が拒否された場合。詳細は、Class.newInstance()を参照してください。IOException - 何らかの入出力操作を使ってリソースを読み取る際にエラーが発生した場合public long getTimeToLive(String baseName, Locale locale)
ResourceBundle.Controlの下でロードされるリソース・バンドルの有効期間(TTL)値を返します。正の有効期間値は、バンドルがその構築元となるソース・データに基づいて検証されずにキャスト内にとどまることのできるミリ秒数を表します。値0は、バンドルがキャッシュから取得されるたびに検証される必要があることを示します。TTL_DONT_CACHEは、ロードされたリソース・バンドルがキャッシュに格納されないことを表します。TTL_NO_EXPIRATION_CONTROLは、ロードされたリソース・バンドルが有効期限制御なしでキャッシュに格納されることを表します。
この有効期限の影響を受けるのは、ResourceBundle.getBundleファクトリ・メソッドによるバンドル・ロード処理だけです。つまり、ファクトリ・メソッドは、キャッシュ内で有効期限の切れたリソース・バンドルを検出すると、needsReloadメソッドを呼び出し、そのリソース・バンドルを再ロードする必要があるかどうかを判定します。needsReloadがtrueを返した場合、そのキャッシュ内のリソース・バンドル・インスタンスがキャッシュから削除されます。それ以外の場合、そのインスタンスはキャッシュ内にとどまり、このメソッドから返された新しいTTL値で更新されます。
キャッシュ内のリソース・バンドルはすべて、実行環境のメモリー制限による、キャッシュからの削除対象となります。大きな正の値が返されても、それは、ロードされたリソース・バンドルがキャッシュ内でロックされることを意味するわけではありません。
デフォルトの実装ではTTL_NO_EXPIRATION_CONTROLを返します。
baseName - 有効期限値が指定されているリソース・バンドルの基底名。locale - 有効期限値が指定されているリソース・バンドルのロケール。TTL_NO_EXPIRATION_CONTROL、キャッシュを無効にする場合はTTL_DONT_CACHE。NullPointerException - baseNameまたはlocaleがnullである場合public boolean needsReload(String baseName, Locale locale, String format, ClassLoader loader, ResourceBundle bundle, long loadTime)
bundleを再ロードする必要があるかどうかを、loadTimeに指定されたロード時刻やその他のいくつかの条件に基づいて判定します。このメソッドは、再ロードが必要な場合はtrueを返し、それ以外の場合はfalseを返します。loadTimeは、Calendarエポックからのミリ秒オフセットです。ResourceBundle.getBundleファクトリ・メソッドの呼出しは、最初にリソース・バンドルをロードした呼出しで使用されるインスタンスではなく、現在の呼出しに使用されるResourceBundle.Controlインスタンスでこのメソッドを呼び出します。
デフォルト実装は、リソース・バンドルのloadTimeと、そのソース・データが最後に変更された時刻とを比較します。loadTime以降にソース・データが変更されたことが判明した場合には、trueが返されます。それ以外の場合はfalseが返されます。この実装は、指定されたformatがデフォルトの形式"java.class"、"java.properties"のいずれでもない場合、その形式がファイル接尾辞と同じ文字列であると仮定します。
baseName - リソース・バンドルの基底バンドル名。完全指定クラス名locale - リソース・バンドルのインスタンス化対象となるロケールformat - ロードされるリソース・バンドルの形式loader - バンドルをロードするために使用するClassLoaderbundle - キャッシュ内で有効期限の切れたリソース・バンドル・インスタンスloadTime - bundleがロードされ、キャッシュ内に格納された時刻true、それ以外の場合はfalse。NullPointerException - baseName、locale、format、loader、またはbundleがnullの場合public String toBundleName(String baseName, Locale locale)
baseNameとlocaleをバンドル名に変換します。このメソッドは、newBundleおよびneedsReloadメソッドのデフォルト実装から呼び出されます。
この実装は次の値を返します。
baseName + "_" + language + "_" + script + "_" + country + "_" + variant
ここで、language、script、country、およびvariantはそれぞれ、localeの言語、スクリプト、国、およびバリアントの値です。最後の要素の値が空のStringである場合、その値と直前の「_」は省略されます。スクリプトが空の場合、スクリプト値は直前の「_」と一緒に省略されます。すべての値が空の文字列である場合には、baseNameが返されます。
たとえば、baseNameが"baseName"、localeがLocale("ja", "", "XX")の場合は、"baseName_ja_ _XX"が返されます。指定されたロケールがLocale("en")の場合は、"baseName_en"が返されます。
このメソッドをオーバーライドすれば、ローカライズ済みリソースの構成やパッケージ化に関する異なる規約をアプリケーションで使用できます。
baseName - リソース・バンドルの基底名。完全指定クラス名locale - リソース・バンドルのロード対象となるロケールNullPointerException - baseNameまたはlocaleがnullである場合public final String toResourceName(String bundleName, String suffix)
bundleNameをClassLoader.getResourceメソッドで必要とされる形式に変換するため、bundleName内のすべての'.'を'/'に置き換え、末尾に1つの'.'と指定されたファイルsuffixを追加します。たとえば、bundleNameが"foo.bar.MyResources_ja_JP"、suffixが"properties"の場合は、"foo/bar/MyResources_ja_JP.properties"が返されます。bundleName - バンドル名suffix - ファイル・タイプ接尾辞NullPointerException - bundleNameまたはsuffixがnullである場合 バグまたは機能を送信
詳細なAPIリファレンスおよび開発者ドキュメントについては、Java SEのドキュメントを参照してください。そのドキュメントには、概念的な概要、用語の定義、回避方法、有効なコード例などの、開発者を対象にしたより詳細な説明が含まれています。
Copyright© 1993, 2014, Oracle and/or its affiliates. All rights reserved.