便利なコードパーツ集!

やまろうのプログラミングTips

Java

[Java] PropertiesをSingleton化する

投稿日:2016年12月6日 更新日:

2003/05/02

ども、GW.split("仕事");
でおなじみのやまろうです(怒)。

ゴールデンウィークが仕事で分割されたのを
Javaで表現してみました(GW.split("仕事");のこと)。
予定では4/29から5/5までずっと休みだったはずなのに、普通に
4/30、5/1と出勤しました(悲)。
しかも、ドキュメント作成ばっかだし、やってらんねーぜ!
アジャイルプロセスしてぇー!!!
アジャイルプロセスってのは、「包括的なドキュメントよりも動作する
ソフトウェア」
っていう精神の開発手法です。「いらねー文書や
契約は省いて、その分、コミュニケーションとテストをたくさん
しようぜ、そしたら、良いソフトウェアが作れるぜ!」
っていう
感じです。(僕なりの解釈)
XP(エクストリームプログラミング)もアジャイルプロセスの一つです。

で、今回はPropertiesファイルをSingletonオブジェクトにしよう
というものです。
デザインパターンに
Singletonパターンってのがあって(ご存知の方も多いと思いますが)
オブジェクトが1つしか存在しないことを保証するパターンなのです。
最初の一回だけ、オブジェクトを生成してそれを使いまわすような
時に使えます。

システムの設定などをPropertiesファイルに
書いておいて、一度だけ読み込んで値を保持しておくなんていうことは
よくやると思うのですが、そういう場面で使える汎用的なクラスを
Singletonパターンを応用して作ってみました。

それではソース行ってみよう!

package singleton;

import java.util.*;
import java.io.*;

//PropertiesファイルをSingletonオブジェクトにするクラス
class SingletonProperties {
  private static Map map = new HashMap();
  
  public static Properties getProperties(String filePath)
    throws IOException {
    
    Properties prop = (Properties)map.get(filePath);     //(1)
    if (prop != null) {
      return prop;
    }                                                    //(2)

    synchronized (SingletonProperties.class) {           //(3)
      prop = (Properties)map.get(filePath);
      if (prop != null) {
        return prop;
      }
    }                                                    //(4)

    prop = new Properties();                             //(5)
    prop.load(new FileInputStream(filePath));
    map.put(filePath, prop);
    return prop;
  }
}

//SingletonPropertiesクラスを利用するサンプル
class Main {
  public static void main(String[] args) throws Exception {
    Properties prop = SingletonProperties.getProperties(args[0]);
    
    //取得したPropertiesを出力
    for (Enumeration e =  prop.propertyNames(); e.hasMoreElements();) {
      String key = (String)e.nextElement();
      String value = prop.getProperty(key);
      System.out.println("キー値:" + key + " 値:" + value);
    }
  }
}

実行しましょう!
このメルマガをSingletonProperties.javaという名前で保存。
そして以下をsample.propertiesという名前で
SingletonProperties.javaと同じディレクトリに保存。
user=musashi
password=hidarimiddle

javac -d . *.java
java singleton.Main sample.properties

実行結果

キー値:user 値:musashi
キー値:password 値:hidarimiddle

(1)〜(2)
SingletonProperties.getProperties(String filePath)を呼び出すと
引数で受け取ったfilePathのPropertiesがmapに登録されているか調べる。
登録されてたら、登録されてるPropertiesを返す。

(3)〜(4)
登録されてない場合、
さっき登録されているか調べてる最中に他のスレッドが
filePathのPropertiesを読み込んでいるかもしれないので、
スレッドと同期を取ってもう一度filePathのPropertiesがmapに
登録されているか調べる。スレッドと同期を取ってるのが
synchronized (SingletonProperties.class)
の構文だ。synchronizedで囲った部分は1つのスレッドから
しか実行出来なくなります。

(5)以降
それでも、登録されてない時はファイルからPropertiesに
読み込んで、mapに登録する。次回同じファイルをgetProperties
したら、登録されているので、そちらを返す。つまりファイルを
読み込んでオブジェクトを生成するのは一度だけというわけです。

これがSingletonパターン!!っとはいえ、このプログラムは
Singletonパターンの応用的な使い方です。本に載っているのは
もっとシンプルです。汎用的にPropertiesをSingletonするために
HashMapを使ってみました。

んじゃぁねぇーーーーーーーー
やまろう

スポンサーリンク

-Java

Copyright© やまろうのプログラミングTips , 2024 AllRights Reserved Powered by AFFINGER4.