Java好き

Javaプログラマ及びインストラクタによるソフトウェア開発に関するブログ

PropertiesのTips

java.util.PropertiesのTipsを2つ。

f:id:tmk463:20120809100135g:plain

JavaSE 6以降では日本語も読み込める

Proprtiesというとnative2asciiのイメージがありますが、JavaSE 6以降であれば不要です。Readerクラスを引数にしたload()メソッドを利用できるので、そのまま読み込むことができます。

Properties properties = new Properties();
InputStream inStream = getClass().getClassLoader().getResourceAsStream("test.properties");
properties.load(new InputStreamReader(inStream, "UTF-8"));
 
//出力
log.debug(properties.getProperty("testkey"));
log.debug(properties.getProperty("testJapanese"));

プロパティをenum化して利用する

プロパティは、基本的にシステムで一つになるような使い方をするので共通化を考えたいです。ロード部分の共通化はもちろんのこと、このようにenumを定義すると利用者がキーの値を打ち込まずに列挙子の指定だけで利用できるので便利です。

次のようにenum化すると、プロパティが増えても列挙子とキーを追加してあげればどこまでも対応できます。

public enum P {
    TEST_KEY("testkey"),
    TEST_JAPANESE("testJapanese");
  //プロパティが増えたら列挙子を追加する
 
    public final String key;
    public final String value;
 
    private P(String key) {
        this.key = key;
        this.value = LoadedProperties.getProperty(key);
    }
}
 
class LoadedProperties {
    private static final String PROPERTIES_PATH = "test.properties";
    private static final Properties PROPERTIES = load(PROPERTIES_PATH);
 
    private static Properties load(String propertyPath) {
        Properties properties;
        try {
            properties = new Properties();
            InputStream inStream = 
              P.class.getClassLoader().getResourceAsStream(propertyPath);
            properties.load(
              new InputStreamReader(inStream, CharEncoding.UTF_8));
        } catch (Exception e) {
            throw new RuntimeException("プロパティ読み込みに関するエラー", e);
        }
        return properties;
    }
 
    static String getProperty(String key) {
        return PROPERTIES.getProperty(key);
    }
}

f:id:tmk463:20120809100135g:plain

関連記事