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

クラスResourceBundle.Control

java.lang.Object
java.util.ResourceBundle.Control
含まれているクラス:
ResourceBundle

public static class ResourceBundle.Control extends Object
ResourceBundle.Controlは、バンドル・ロード処理中にResourceBundle.getBundleファクトリによって呼び出される一連のコールバック・メソッドを定義します。 つまり、ResourceBundle.Controlは、リソース・バンドルのロード時にファクトリ・メソッドと連携して動作します。 コールバック・メソッドのデフォルト実装は、ファクトリ・メソッドがデフォルト動作を実行するために必要な情報を提供します。

ResourceBundle.Controlは、名前のないモジュールにデプロイされたアプリケーション用に設計されています。たとえば、非標準形式のリソース・バンドルをサポートしたり、非伝統的な規則でローカライズされたリソースをパッケージ化することができます。 ResourceBundleProviderは、モジュールに移行するときのResourceBundle.Controlの代わりです。 ResourceBundle.Controlパラメータを受け取るファクトリ・メソッドが呼び出されると、UnsupportedOperationExceptionがスローされます。

コールバック・メソッドの他に、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", Locale.forLanguageTag("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() {
        ...
    }
}

APIのノート:
ResourceBundle.Controlは、指定されたモジュールではサポートされていません。 名前付きモジュールでResourceBundle.Controlを含むResourceBundle.getBundleメソッドが呼び出された場合、メソッドはUnsupportedOperationExceptionをスローします。 ResourceBundleControlProviderのサービス・プロバイダは、指定されたモジュールでは無視されます。
導入されたバージョン:
1.6
関連項目: