JavaTM 2 Platform
Std. Ed. v1.3

java.util
クラス ResourceBundle

java.lang.Object
  |
  +--java.util.ResourceBundle
直系の既知のサブクラス:
ListResourceBundle, PropertyResourceBundle

public abstract class ResourceBundle
extends Object

リソースバンドルには、ロケール固有のオブジェクトが含まれます。プログラムで String などのロケール固有のリソースが必要なときは、ユーザのロケールに合ったリソースバンドルからロードできます。このように、リソースバンドルから、ロケール固有の情報のすべてでなくてもその大部分を切り離すことで、ユーザのロケールにはほとんど依存しないプログラムコードを書くことができます。

これにより、以下の特徴を持つプログラムを書くことが可能になります。

1 つのリソースバンドルは、概念的には、ResourceBundle から継承する関連クラスのセットです。ResourceBundle 関連サブクラスは、どれも同じベース名とロケールを識別する追加要素を持っています。たとえば、MyResources という名前のリソースバンドルがあるとします。この最初のクラスは、そのファミリ MyResources と単に同じ名前を持つデフォルトのリソースバンドルであると想定できます。これに、関連したロケール固有のクラスを必要なだけ設定できます。たとえば、MyResources_de という名前のドイツ語版を設定できます。

ResourceBundle の関連するサブクラスそれぞれには、同じ項目が含まれていますが、その項目は個々の ResourceBundle サブクラスが表しているロケールに合わせて翻訳されています。たとえば、MyResourcesMyResources_de の両方に操作取り消し用のボタンに使用される String が含まれているとします。このとき、MyResources では StringCancel が、MyResources_de では Abbrechen が定義されています。

同じ言語を使用するロケールでも国によってリソースが異なるときは、特殊化が可能です。たとえば、MyResources_de_CH はスイス (CH) 系のドイツ語 (de) になります。リソースの一部だけを修正することもできます。

プログラムでロケール固有のオブジェクトが必要なときは、getBundle メソッドを使用して ResourceBundle クラスをロードします。

 ResourceBundle myResources =
      ResourceBundle.getBundle("MyResources", currentLocale);
 
最初の引数では、目的のオブジェクトを含むリソースバンドルのファミリ名を指定します。2 番目の引数では、目的のロケールを指定します。getBundle は、この 2 つの引数を使って、ロードする ResourceBundle サブクラスの名前を以下のように構築します。

リソースバンドルの照合は、(1) 目的のロケール、(2) Locale.getDefault() によって返された現在のデフォルトロケール、(3) ルートリソースバンドル (基底クラス) に基づいて、さまざまな接尾辞を持つクラスを、低いレベル (限定度が高い) から親レベル (限定度が低い) を次の順序で検索します。

baseclass + "_" + language1 + "_" + country1 + "_" + variant1
baseclass + "_" + language1 + "_" + country1 + "_" + variant1 + ".properties"
baseclass + "_" + language1 + "_" + country1
baseclass + "_" + language1 + "_" + country1 + ".properties"
baseclass + "_" + language1
baseclass + "_" + language1 + ".properties"
baseclass + "_" + language2 + "_" + country2 + "_" + variant2
baseclass + "_" + language2 + "_" + country2 + "_" + variant2 + ".properties"
baseclass + "_" + language2 + "_" + country2
baseclass + "_" + language2 + "_" + country2 + ".properties"
baseclass + "_" + language2
baseclass + "_" + language2 + ".properties"
baseclass
baseclass + ".properties"

たとえば、現在のデフォルトロケールが en_US であり、呼び出し側が関心を持っているロケールが fr_CH、リソースバンドル名が MyResources である場合、リソースバンドルの照合は、次のクラスを次の順序で検索します。
MyResources_fr_CH
MyResources_fr
MyResources_en_US
MyResources_en
MyResources

照合の結果はクラスになりますが、クラスはディスク上のプロパティファイルによって返されることがあります。つまり、getBundle で指定した名前のクラスが見つからなかった場合、「プロパティ」がクラス名に追加され、その名前のプロパティファイルが検索されます。その名前のファイルが見つかると、新しい PropertyResourceBundle オブジェクトが作成され、保持されます。前の例に従って、以下のように設定の変更を指定するクラスおよびファイルが返されます。 (class) MyResources_fr_CH (file) MyResources_fr_CH.properties (class) MyResources_fr (file) MyResources_fr.properties (class) MyResources_en_US (file) MyResources_en_US.properties (class) MyResources_en (file) MyResources_en.properties (class) MyResources (file) MyResources.properties 照合が失敗すると、getBundle() では MissingResourceException がスローされます。

基底クラスは、完全に合致している必要があります (たとえば、MyResources ではなく myPackage.MyResources でなければならない)。また、コードからアクセス可能である必要があります。ResourceBundle.getBundle が呼び出されるパッケージは private なクラスにすべきではありません。

注: ResourceBundle は、NumberFormatCollation などへのアクセス時に内部的に使用されます。照合方法は同じです。

リソースバンドルは、キーと値のペアになっています。キーは、バンドルのロケール固有のオブジェクトを一意に識別します。キーと値の 2 つのペアが含まれている ListResourceBundle の例を示します。

 class MyResource extends ListResourceBundle {
      public Object[][] getContents() {
              return contents;
      }
      static final Object[][] contents = {
      // LOCALIZE THIS
              {"OkKey", "OK"},
              {"CancelKey", "Cancel"},
      // END OF MATERIAL TO LOCALIZE
      };
 }
 
キーは常に String です。この例では、キーは OkKeyCancelKey です。上の例では、値 OKCancelString ですが、必ずしもそうである必要はありません。値は、どのタイプのオブジェクトでも可能です。

リソースバンドルから適切な getter メソッドを使用してオブジェクトを検索します。OkKeyCancelKey はどちらも文字列なので、検索には getString を使用します。

 button1 = new Button(myResourceBundle.getString("OkKey"));
 button2 = new Button(myResourceBundle.getString("CancelKey"));
 
getter メソッドは、すべて引数としてキーを要求し、検出したオブジェクトを返します。オブジェクトが見つからない場合、getter メソッドは MissingResourceException をスローします。

getString 以外に、ResourceBundle では、getStringArray のような異なるタイプのオブジェクトを取得するメソッドが複数サポートされています。オブジェクトがこれらのメソッドに一致しない場合は、getObject を使用して結果を適切なタイプにキャストできます。次に例を示します。

 int[] myIntegers = (int[]) myResources.getObject("intList");
 

注: 常に接尾辞なしの基底クラスを用意しておく必要があります。これは、そのロケール固有のクラスを持たないロケールが要求されたときに、適用される「最後の手段」となります。実際には、リソースを提供するすべての継承チェーンのすべてのクラスを提供する必要があります。たとえば、MyResources_fr_BE を提供する場合は、MyResourcesMyResources_fr の両方を提供しないと、リソースバンドルの参照は正しく行われません。

Java 2 プラットフォームでは、ResourceBundle の 2 つのサブクラス ListResourceBundle および PropertyResourceBundle が用意されています。これらはリソースを作成する簡単な方法を提供します (直列化が完全に統合されたら、ほかの方法を提供する予定)。前の例で簡単に示したように、ListResourceBundle は、そのリソースをキーと値のペアのリストとして管理します。PropertyResourceBundle は、プロパティファイルを使用してそのリソースを管理します。

ListResourceBundle または PropertyResourceBundle では不十分なときは、独自の ResourceBundle サブクラスを書くことができます。それらのサブクラスでは、handleGetObject メソッドおよび getKeys() メソッドの 2 つをオーバーライドする必要があります。

以下は ResourceBundle のサブクラス MyResources の非常に簡単な例です。このサブクラスは 2 つのリソースだけを管理します (多数のリソースを管理するサブクラスには、Hashtable を使用する)。キーが見つからない場合は、handleGetObject が null を返す必要があります。また、キーが null の場合は、NullPointerException がスローされます。「親レベル」の ResourceBundle で同じキーに同じ値が設定されているときは、値を提供する必要はありません (以下の例の United Kingdom を参照)。さらに、en_GB リソースバンドルを指定したためルートリソースバンドルからすべてのデータを継承する場合でも、デフォルトの en リソースバンドルも提供する必要があります。

例:

 // default (English language, United States)
 abstract class MyResources extends ResourceBundle {
     public Object handleGetObject(String key) {
         if (key.equals("okKey")) return "Ok";
         if (key.equals("cancelKey")) return "Cancel";
     return null;
     }
 }

 // 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;
     }
 }
 
ResourceBundle のシングルファミリの使用を制限する必要はありません。たとえば、例外メッセージ ExceptionResources (ExceptionResources_frExceptionResources_de など) で 1 つのリソース、ウィジェット WidgetResource (WidgetResources_frWidgetResources_de など) で 1 つのリソースというように、好きなようにリソースを分割してバンドルのセットを持つこともできます。

導入されたバージョン:
JDK1.1
関連項目:
ListResourceBundle, PropertyResourceBundle, MissingResourceException

フィールドの概要
protected  ResourceBundle parent
          このバンドルが特定のリソースを含まない場合には、getObject は親バンドルを参照します。
 
コンストラクタの概要
ResourceBundle()
          唯一のコンストラクタです。
 
メソッドの概要
static ResourceBundle getBundle(String baseName)
          適切な ResourceBundle サブクラスを取得します。
static ResourceBundle getBundle(String baseName, Locale locale)
          適切な ResourceBundle サブクラスを取得します。
static ResourceBundle getBundle(String baseName, Locale locale, ClassLoader loader)
          適切な ResourceBundle サブクラスを取得します。
abstract  Enumeration getKeys()
          キーの列挙を返します。
 Locale getLocale()
          ResourceBundle の Locale を返します。
 Object getObject(String key)
          ResourceBundle からオブジェクトを取得します。
 String getString(String key)
          ResourceBundle からオブジェクトを取得します。
 String[] getStringArray(String key)
          ResourceBundle からオブジェクトを取得します。
protected abstract  Object handleGetObject(String key)
          ResourceBundle からオブジェクトを取得します。
protected  void setParent(ResourceBundle parent)
          このバンドルの親バンドルを設定します。
 
クラス java.lang.Object から継承したメソッド
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

フィールドの詳細

parent

protected ResourceBundle parent
このバンドルが特定のリソースを含まない場合には、getObject は親バンドルを参照します。
コンストラクタの詳細

ResourceBundle

public ResourceBundle()
唯一のコンストラクタです。サブクラスのコンストラクタによる呼び出しは、通常は暗黙的な呼び出しです。
メソッドの詳細

getString

public final String getString(String key)
                       throws MissingResourceException
ResourceBundle からオブジェクトを取得します。
キャストを保存する簡易メソッドです。
パラメータ:
key - クラスの説明を参照してください。
例外:
NullPointerException - keynull の場合

getStringArray

public final String[] getStringArray(String key)
                              throws MissingResourceException
ResourceBundle からオブジェクトを取得します。
キャストを保存する簡易メソッドです。
パラメータ:
key - クラスの説明を参照してください。
例外:
NullPointerException - keynull の場合

getObject

public final Object getObject(String key)
                       throws MissingResourceException
ResourceBundle からオブジェクトを取得します。
パラメータ:
key - クラスの説明を参照してください。
例外:
NullPointerException - keynull の場合

getLocale

public Locale getLocale()
ResourceBundle の Locale を返します。この関数は、返された ResourceBundle が本当に要求されたロケールに対応しているか、またはフォールバックであるかを判定するために、getBundle() を呼び出したあとで使用できます。

setParent

protected void setParent(ResourceBundle parent)
このバンドルの親バンドルを設定します。親バンドルは、このバンドルに特定のリソースが含まれていないときに getObject によって参照されます。
パラメータ:
parent - このバンドルの親バンドル

getBundle

public static final ResourceBundle getBundle(String baseName)
                                      throws MissingResourceException
適切な ResourceBundle サブクラスを取得します。
パラメータ:
baseName - クラスの説明を参照してください。

getBundle

public static final ResourceBundle getBundle(String baseName,
                                             Locale locale)
適切な ResourceBundle サブクラスを取得します。
パラメータ:
baseName - クラスの説明を参照してください。
locale - クラスの説明を参照してください。

getBundle

public static ResourceBundle getBundle(String baseName,
                                       Locale locale,
                                       ClassLoader loader)
                                throws MissingResourceException
適切な ResourceBundle サブクラスを取得します。
パラメータ:
baseName - クラスの説明を参照してください。
locale - クラスの説明を参照してください。
loader - リソースをロードする ClassLoader

handleGetObject

protected abstract Object handleGetObject(String key)
                                   throws MissingResourceException
ResourceBundle からオブジェクトを取得します。注: サブクラスでオーバーライドする必要があります。
パラメータ:
key - クラスの説明を参照してください。
例外:
NullPointerException - keynull の場合

getKeys

public abstract Enumeration getKeys()
キーの列挙を返します。注: サブクラスでオーバーライドする必要があります。

JavaTM 2 Platform
Std. Ed. v1.3

バグや機能要求の報告
さらに詳しい API リファレンスおよび開発者ドキュメントについては、 Java 2 SDK SE Developer Documentation を参照してください。このドキュメントには、概念、用語の定義、回避策、 実用的なコード例など、開発者を対象にした詳細な解説が掲載されています。

Java、Java 2D、JDBC は、米国およびその他の国における米国 Sun Microsystems, Inc. の商標もしくは登録商標です。
Copyright 1993-2000 Sun Microsystems, Inc. 901 San Antonio Road,
Palo Alto, California, 94303, U.S.A. All Rights Reserved.