Javaでは、定数やファイルパスなどの情報を「プロパティファイル」と呼ばれる、プログラムとは別のファイルにまとめておくことが推奨されています。こうすることで、汎用性の高いプログラムを作成できます。さらに、プロパティファイルを修正するだけで、再コンパイルをしなくても値の変更を反映させることができるので便利です。
プロパティファイルは「.properties」という拡張子を持つファイルで、キーと値のペアを「=」または「:」で区切った形式で記述します。また、行頭が「#」または「!」で始まる行は、コメント行として扱われます。以下は、円周率の値などを定義したサンプルのプロパティファイル「calculator.properties」です。
# 円周率の値 pi = 3.141 ! 自然対数の底 e : 2.718
プロパティファイルを使用するには、JavaのコアAPIとして用意されているjava.util.Propertiesクラスを利用します。このPropertiesクラスは、サブクラス化する必要もなく、そのままインスタンス化して用いることができます。
一般的な用法としては、Propertiesインスタンスをプロパティファイルを利用したいクラスのフィールドとして宣言しておきます。そして、そのクラスのコンストラクタなどで、Propertiesフィールドのload(InputStream)メソッドを用いてプロパティファイルを読み込んでおけば、Propertiesフィールドを通して、どのメソッドからもプロパティファイルの値を参照できるようになります。一方、プロパティファイルの値を参照する際は、Properties#getProperty(String)メソッドを用います。引数にキーを渡すと、そのキーに対応した値が文字列として返されます。
以下のサンプルコードは、プロパティファイル「calculator.properties」にある円周率の値「pi」を読み込んで、与えられた半径に対して円の面積を計算します。
import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.util.Properties; public class Calculator { private Properties configuration = new Properties(); private double pi; public Calculator() { try { InputStream inputStream = new FileInputStream(new File( "calculator.properties")); configuration.load(inputStream); pi = Double.parseDouble(configuration.getProperty("pi")); } catch (IOException e) { e.printStackTrace(); } } private double getAreaOfCircle(double radius) { return radius * radius * pi; } public static void main(String[] args) { Calculator calculator = new Calculator(); double radius = 10; System.out.println("半径 " + radius + " の円の面積は " + calculator.getAreaOfCircle(10) + " です。"); } }
このCalculatorクラスをjavacコマンドでコンパイルし実行すると、結果は以下のようになります。なお、プロパティファイルを利用する際は、実行するプログラムと利用するプロパティファイルが同一フォルダ内になければならないことに注意してください。
>javac Calculator.java >java Calculator 半径 10.0 の円の面積は 314.1 です。
この結果から、calculator.propertiesで設定されている円周率の値である「pi = 3.141」が参照されていることが分かります。
次に、このプロパティファイル「calculator.properties」の値を修正して、結果がどのように変化するかも確認してみましょう。前述のプロパティファイル「calculator.properties」の「pi」の値を次のように修正します。
pi = 3
プロパティファイル「calculator.properties」の修正が終わったら、Calculator.classを再度実行します。
>java Calculator 半径 10.0 の円の面積は 300.0 です。
Calculatorクラスを再コンパイルをしなくても、プロパティファイル「calculator.properties」の変更がプログラムの実行結果に反映されていることが分かります。
実際には、今回の例のように円周率のような値を変更することはあまりないと思いますが、データベース接続におけるユーザー名やパスワードなど、応用例はいろいろ考えられますので、プロパティファイルを活用してより汎用性の高いプログラムを作成するよう心掛けてください。
注意:クラスが多数あるような大きなプログラムを書くときは、外部設定ファイルを扱うクラスは1つ(または数個)だけにして、ほかのクラスはそのクラスを通して設定値を参照するようにした方が、すっきりとした設計にすることができます。
Copyright © ITmedia, Inc. All Rights Reserved.