Javaのリソースデータ (3)

今回は、リソースバンドルの概要について書きます。自分用の覚え書きということもあり、あまりまとまっていません。
前回: id:simply-k:20100719:1279499319
次回: id:simply-k:20100724:1279945345
目次: id:simply-k:20100728:1280299110

リソースバンドルの概要

使い道

リソースデータをロケールごとに切り替える場合に使う。

ResourceBundleクラス
  • 抽象クラス
  • staticメソッドのResourceBundle#getBundle()を呼び出すと、サブクラスのインスタンスが返される。
  • 取得したサブクラスのインスタンスには、キーと値の組が格納されている。
  • サブクラス一覧
    • PropertyResourceBundleクラス
    • ListResourceBundleクラス
    • その他のクラス (自前のクラス)
  • ResourceBundle#getBundle()は、複数のメソッドがオーバーロードされている。
  • ResourceBundle#getBundle()の引数
    • リソースバンドルの基底名 (必須)
    • Locale指定 (省略可)
    • ClassLoader指定 (省略可)
    • ResourceBundle.Control指定 (省略可)
ResourceBundle#getBundle()の使用例
//「jp.co.foo」パッケージの「resource」を基底名として指定する。
//デフォルトのロケールを使用する。
ResourceBundle rb1 = ResourceBundle.getBundle("jp.co.foo.resource");

//ロケールにja_JPを指定する。
ResourceBundle rb2 = ResourceBundle.getBundle("jp.co.foo.resource", Locale.JAPAN);

//ロケールにja_JPを指定し、プロパティーベースのリソースのみを検索する。(Java 6以降)
ResourceBundle rb3 = ResourceBundle.getBundle("jp.co.foo.resource", Locale.JAPAN, 
    ResourceBundle.Control.getControl(FORMAT_PROPERTIES));
リソース名(基底名)の指定方法
  • リソース名はパッケージ付きで指定する。(FQDN)
  • 「_ja_JP」のようなロケールは付けない。
  • 拡張子は付けない。
  • 「.」の代わりに「/」を使っても動作する。(例: jp/co/foo/bar/resource)
  • 先頭に「.」や「/」を付けない。
リソースの決定方法
  • 指定したリソース名とロケールから、候補となるバンドル名が決定される。
  • リソース名が「resource」、ロケールが「ja_JP」の場合のバンドル名の候補
    • resource_ja_JP
    • resource_ja
    • resource
  • バンドル名を持つclassファイルを検索し、見つからなかった場合はpropertiesファイルを検索する。
補足
  • パッケージ内にプロパティファイル名と同じ名前のクラスが存在すると、クラスの方がロードされてしまう。
  • ResourceBundle#getBundle()でResourceBundle.Controlクラスを指定すると、リソースデータの取得方法を制御できる。(Java 6以降)
  • 内部的には、以下のようにしてリソースを取得する。
    1. バンドル名の「.」を「/」に置換する。
    2. 拡張子を付加する。
    3. ClassLoader#getResource()でリソースを取得する。
  • 詳細はJavaDocを参照*1
PropertyResourceBundleクラス
  • キー(String)と値(String)の組を保持する。(HashMapに似ている)
  • プロパティファイルの値が自動的にセットされる。
  • XML形式のプロパティファイルはサポートされない。*2
ListResourceBundleクラス
  • キー(String)と値(Object)の組を保持する。(HashMapに似ている)
  • 抽象クラスなので、サブクラスを作成する必要がある。
  • ListResourceBundle#getContents()をオーバーライドして、キーと値の組を返すようにする。
  • PropertyResourceBundleクラスと違い、String以外の値を扱うことができる。
ResourceBundle.Controlクラス
  • ResourceBundle#getBundle()の動作を制御する。
  • staticメソッドのResourceBundle.Control#getControl()により、インスタンスを生成する。
  • リソースの種類(クラス、プロパティファイル)を制限できる。
  • サブクラスを作ることにより、詳細な制御が可能となる。


前回: id:simply-k:20100719:1279499319
次回: id:simply-k:20100724:1279945345
目次: id:simply-k:20100728:1280299110

*1:http://java.sun.com/javase/ja/6/docs/ja/api/java/util/ResourceBundle.html#getBundle%28java.lang.String,%20java.util.Locale,%20java.lang.ClassLoader,%20java.util.ResourceBundle.Control%29

*2:XML形式のプロパティファイルを扱いたい場合は、ResourceBundleクラスとResourceBundle.Controlクラスのサブクラスを作る必要があります。