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 |
ResourceBundle.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
protected ResourceBundle.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.ROOT
Locale のバリアントの値が下線で区切られた複数のサブタグから成る場合は、バリアントサブタグを 1 つずつ省略して候補 Locale を生成し、元のリスト内で完全なバリアント値を持つ各 Locale のあとにそれらを追加します。たとえば、バリアントが 2 つのサブタグ V1 および V2 から成る場合は、次のようになります。
Locale.ROOT
Locale ロケールの言語が「zh」(中国語) で、スクリプトの値が空の場合は、国に応じて「Hans」(簡体字) または「Hant」(繁体字) が指定されます。国が「CN」(中国) または「SG」(シンガポール) の場合は、「Hans」が指定されます。国が「HK」(香港特別行政区、中国)、「MO」(マカオ特別行政区、中国)、または「TW」(台湾) の場合は、「Hant」が指定されます。その他の国では、国が空の場合、スクリプトは指定されません。たとえば、Locale("zh", "CN") の場合、候補リストは次のようになります。
Locale.ROOT
Locale("zh", "TW") の場合、候補リストは次のようになります。
Locale.ROOT
Locale("no", "NO", "NY") と Locale("nn", "NO") はどちらもノルウェー語ニーノシクを表します。ロケールの言語が「nn」の場合、標準の候補リストは [L("nn")] まで生成されたあと、次の候補が追加されます。
Locale.ROOT
Locale("no", "NO", "NY") の場合は、まず Locale("nn", "NO") に変換されたあと、上記の処理が行われます。
また、Java は言語「no」をノルウェー語ブークモール「nb」の同義語として扱います。この Locale("no", "NO", "NY") (上記のように処理される) 以外は、入力 Locale の言語が「no」または「nb」の場合、言語コード「no」と「nb」を持つ候補 Locale が交互に追加されます。まず要求された言語、次にその同義語が使用されます。たとえば、Locale("nb", "NO", "POSIX") では、次の候補リストが生成されます。
Locale.ROOT
Locale("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, 2013, Oracle and/or its affiliates. All rights reserved.