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
実行結果
キー値: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を使ってみました。
んじゃぁねぇーーーーーーーー
やまろう