はじめに
java Goldの勉強の最中で、情報の外部化・propertiesファイルのあれこれについて、サンプルコードを用いて理解したいと考え、統合開発環境下でコードを記述、実行してみました。
しかし、いくらやってもMissingResoueceExceptionが出ます。
なぜなのか…。
実行時エラーとにらめっこしながら試行錯誤した結果、注意すべきポイントを知ることが出来ました。以下、備忘録です。
サンプルコード
package com.example.Locale.properties;
import java.util.ListResourceBundle;
public class MyResource extends ListResourceBundle{
private final static String resources[][] = {
{"helloworld", "Hello, World!"},
{"key","This is MyResource's key!"}
};
@Override
protected Object[][] getContents() {
return resources;
}
}
上のコードに記述した"key"を実行クラスで取得したいと思います。
※クラスを用いたリソースバンドルを作成する場合、ResourceBandleのサブクラスであるListResoueceBundleやPropertyResourceBundleを継承する必要があります。
また、ListResourceBundleは抽象クラスのため、抽象メソッド『getContents』の実装が必須です。
実行クラスにおける注意点
1.クラスファイルがどこに配置されるかを意識する
例えば、以下のようなサンプルコードが示されていたとします。
ResourceBundle rb = ResourceBundle.getBundle("MyResource");
しかし、これではうまく取得できませんでした。
小一時間調べた結果、勉強で使っている黒本(徹底攻略 Java SE 8 Gold 問題集)の解説文に、ヒントが載っていました。
[注意]
リソース・バンドルとなるクラスがパッケージに含まれている場合にはパッケージ名での修飾を忘れないようにしましょう。
即ち、getBundle内に記述すべき名前は、パッケージ名を含めた完全修飾名でなければならなかったのです。
上に挙げたコードでは、MyResourceクラスはデフォルトパッケージに居なければなりませんでした。しかし、実際にはパッケージ内で定義していたため、ファイルを移動するか、括弧内を完全修飾名で記述する必要があります。
以下、完全修飾名で記述した実行クラスの一部と実行結果を載せます。
- 実行クラス
//リソースクラス名は完全修飾名で記述する。
ResourceBundle rb = ResourceBundle.getBundle("com.example.Locale.properties.MyResource");
String message = rb.getString("key");
System.out.println(message);
- 実行結果
This is MyResource's key!
あとがき
心身の問題があって実際現場で働いている身分ではない為、誤った内容・古めかしい内容になっているかもしれませんが、今後も気づいたことやわかったことがあれば備忘録としてメモしていきたいと思います。
実体験や指摘等、何かあればコメントいただけますと嬉しいです。
以上、ご拝読ありがとうございました。