正方形の周長 #15

日本語化用のファイルに不備があって必要なキー文字列に対応するものが存在しない場合、
例えば、SquareParametersResources_ja.propertiesのgui.side.labelの行をコメントアウトすると、

SquareParametersResources_ja.properties (試験的に一時変更)
# gui.side.label = \u4e00\u8fba\u306e\u9577\u3055
gui.perimeter.label = \u5468\u306e\u9577\u3055
model.side.exception.message = \u4e00\u8fba\u306e\u9577\u3055\u3068\u3057\u3066 {0} \u306f\u4e0d\u6b63\u3067\u3059


のように欠落したリソースはSquareParametersResources.properties側の相当する物で補ってくれる。

問題はSquareParametersResources.propertiesの不備でキー文字列に対応するものが無かったり、
SquareParametersResources.properties自体が見つからなかったりする場合である。
不備のあるキー文字列を引数にしてSquareParametersRes.get()を呼ぶとMissingResourceExceptionが投げられる。
getメソッドを呼ぶ側で、実行を投げ出すなり代替処理を行うなり、
この例外に適切に対処するようにコーディングすればいいのだが、
リソースを参照する処理は多いだろうし色々な場所に散らばっているであろうし、
そもそも多言語対応が必要な部分であるので適切な処理をコード側で書こうとするのはなかなか難しいと思う。
最後の適切な処理うんぬんは置いておいて、
呼び出し側各所で対処するのが面倒だが例外でアプリケーション自体が止まるのも嫌な場合は、

import java.util.MissingResourceException;
import java.util.ResourceBundle;

public class SquareParametersRes {
    private static ResourceBundle resources = ResourceBundle.getBundle("SquareParametersResources");

    public static String get(String key) {
        try {
            return resources.getString(key);
        } catch (MissingResourceException e) {
            return "*** missing resource ***";
        }
    }
}

SquareParametersResources_ja.propertiesだけでなくSquareParametersResources.propertiesにもgui.side.labelが無い場合、

となり不備のあるキー文字列に対応したものはその旨の文字列で置き換えられる。
必要ならMissingResourceExceptionのcatch節で例外を表示したりログ出力したりするなどの処理を入れればいいと思う。

リソースファイルにキー文字列に対応するものが存在しないのではなく、
SquareParametersResources_ja.propertiesもSquareParametersResources.propertiesもそれ自体が存在しない場合は、
SquareParametersResクラスがJVMにロードされた時点でResourceBundle.getBundle()から例外が投げられる。
これは上のgetメソッドに対する変更部分とは無関係の部分で起きる。
こういう事態はかなり異常なことなので素直に例外を吐いて停止するのがいいと思う。
ただ、コンソール等目に見えるところに例外を吐いてくれる環境で実行していればいいが、そうでないことも多いだろうから、
クラスフィールドresourcesの初期化は静的初期化子内で行って、
MissingResourceExceptionが投げられたらログを取るなどの対応を取ればいいと思う。