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を使ってみました。
んじゃぁねぇーーーーーーーー
やまろう