Preferences

ワードプロセッサソフトウェアのテンプレート文書を置くフォルダや、 ユーザ毎の文書フォルダといったものは、インストールした時に指定した処とは 異なったフォルダに変更したりします。次に起動した時にはその変更後の 場所を使って欲しいわけですが、プログラムとしてはその場所をどうやって 憶えておけばよいでしょうか。設定ファイルを用意しておき、 その中に設定情報を保存しておくというのがすぐに思いつく方法ですが、 今度はその設定ファイルがどこにあるのかをどうやって知るのかが 問題になります。インストールディレクトリの下ですか? でもインストールディレクトリはどうやって知ればよいでしょうか。

結局この手の問題は、システム(OS)がソフトウェアに対してそうした設定 情報を保存するための専用の場所を提供する、という手段に頼らざるを 得なくなります。Unix系OSならば/etcや/usr/etcの下、Windowsならば レジストリというのが多いパターンです。

Windowsだと何でもかんでもsystem32の下に入れておく、という流儀も あるようですが、危険極まりないですよね。

こうした永続性のある設定情報をPreferencesと呼ぶのはMacintosh 以来の習慣だと思いますが、Javaではこうした機能を java.util.prefs.Preferencesというクラスで 提供しています。このクラスはJRE1.4から提供されたものですが、 プラットフォームに独立した永続性のある設定機能を提供していますので、 マルチプラットフォームのアプリケーションにとっては有用なものです。

Preferencesの使い方は簡単です。まずはPreferencesインスタンスを 取得します。Preferencesはabstractクラスなので、その機能を実装した 具象クラスが別にあるわけですが、利用するだけならそのあたりは 気にすることなく、Preferencesのstaticメソッドを使って取得する 事ができます。

例えばあるクラスorg.domain.HogeHogeでユーザ毎のワークディレクトリ を管理する場合は、

package org.domain;

import java.util.prefs.Preferences;

/**
 * ユーザ毎のワークディレクトリを管理するクラス。
 */
public class HogeHoge {
	// ワークディレクトリ情報を保持するPreferences
	private Preferences pref = null;

	/**
	 * コンストラクタ。
	 */
	public HogeHoge() {
		this.pref = Preferences.userNodeForPackage(this.getClass());
	}
	:
}
という風にPrefencesオブジェクトを取得します。userNodeForPackageメソッド の引数はClassオブジェクトです。

永続性がある(プログラムを起動しなおしても、直前の終了時の値が有効になっている) という点を除けば、キーとキーに対応する値を管理できるという意味でPreferencesは Propertiesと似ています。putで値を設定し、getで値を取り出すことができます。 ただしPreferencesは必ずデフォルト値を指定してgetする点、getIntやgetBooleanと いった、String以外のオブジェクトの値を返すメソッドがある点、設定情報を XMLドキュメントとしてエクスポート/XMLドキュメントからインポートできる点、 そして何より永続性がある点でより高機能です。

さらに個々のPreferencesがノードとなった階層構造をとっているのも特徴です。 Javaのパッケージ構造がツリー状の階層構造をとっているのにあわせて、個々の Preferencesのノードもツリー状の階層構造になります。例えば上記の例の HogeHogeクラス内で取得したPreferencesの場合、HogeHogeのパッケージが org.domainですから、/org/domainというパスのノードということになります。 userNodeForPackageの引数にHogeHogeのクラスオブジェクトを渡しているのは Preferencesのパスを取得するのにパッケージ情報を参照したからです。

ノードのパスをパッケージ名からではなく、直接渡す事でもPreferencesオブジェクト を取り出すこともできます。

pref = Preferences.userRoot().node("/org/domain");
のようにルートノードのnodeメソッドを使用すればよいのです。

ユーザ毎の設定ではなく全ユーザに影響のある設定(例えばプログラムの インストールディレクトリといった)を管理する場合はシステム用のPreferences ノードを取得します。上記の例の "user" と書いている部分を "system" とする だけです。

Sunのリファレンス実装では、Preferences情報はWindows環境ではレジストリに 保存されています。例えばユーザ毎のPreferencesの場合、

HKEY_CURRENT_USER\Software\JavaSoft\Prefs
の下にパッケージ に対応するPreferencesの階層構造が作られます。レジストリはregedtで 覗くことができますが、壊さないように気をつけてください。

Preferencesの詳しい使い方はJ2SDKに付属している "Preferences API" という ドキュメントおよびJavaDocを参照してください。


人材開発室 PoisonSoft