【Java入門】プロパティファイルにキーを追加してもコード修正をしなくて済む方法
プロパティファイルはキー=値の組で情報を保持するファイルです。
    
以下のプロパティファイルは、KEY1、KEY2、KEY3に国の名前を持たせ、
そのキー(KEY1、KEY2、KEY3)を:で連結してMASTER_KEYの値として持たせています。
test.properties
MASTER_KEY=KEY1:KEY2:KEY3
KEY1=Japan
KEY2=America
KEY3=China
上記のプロパティファイルから値を取得するJavaの実装が以下です。
Java
package com.example;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
public class App {
    public static void main( String[] args ){
        Properties properties = new Properties();
        InputStream inStream = null;
        //プロパティファイルが格納されているパス
        String path = "\\c:\\workspace\\test.properties";
        try {
            inStream = new FileInputStream(path);
            //プロパティファイルを読み込む
            properties.load(inStream);
            //「MASTER_KEY」に紐づく値を取得。
            String masterValue = properties.getProperty("MASTER_KEY");
            //「:」でスプリット
            String[] keys = masterValue.split(":");
            //スプリットしたKeyの数だけループ
            for (String key : keys){
                //keyを基にプロパティファイルから値を取得。
                String value = properties.getProperty(key);
                //値を出力。
                System.out.println(value);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
実行結果は以下のとおりになります。
実行結果
Japan
America
China
プロパティファイルには、MASTER_KEYというキーがあり、その値がKEY1:KEY2:KEY3になっています。
これをJava側で:でスプリットします。
その結果KEY1、KEY2、KEY3に分割されます。
Java側でこの文字列をキーとして再度プロパティファイルにアクセスします。
こうすることでKEY1、KEY2、KEY3に対応したJapan、America、Chinaが取得できるという仕組みです。
このプロパティファイルにキーを増やしたくなったとしましょう。
例えば、フランスの情報を追加したくなったら以下のようにtest.propertiesを修正します。
test.properties
MASTER_KEY=KEY1:KEY2:KEY3:KEY4
KEY1=Japan
KEY2=America
KEY3=China
KEY4=France
まず、フランスの情報としてKEY4=Franceを定義します。
次に、キーであるKEY4をMASTER_KEY側にも追記してMASTER_KEY=KEY1:KEY2:KEY3:KEY4とします。
こうすることで、Java側のコード修正を伴わずに、プロパティファイルの情報を追加するだけで「フランス」に対応したアプリ改修が完了します。
以下は実行結果です。
実行結果
Japan
America
China
France
プロパティキーから取得した値に応じて処理分岐するには、キーを判定して分岐するのがオススメです。
以下のプロパティファイルでは、家の情報と車の情報を保持しています。
test.properties
MASTER_KEY=HOME:CAR
HOME=home1:home2:home3
CAR=car1:car2:car3
home1=tokyo
home2=california
home3=paris
car1:toyota
car2:tesla
car3:volkswagen
Java側の実装は以下のとおりです。以下の処理ではstartWithでキーの始まりが何であるかを判定して処理分岐を行っています。
Java
package com.example;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
public class App {
    public static void main( String[] args ){
        Properties properties = new Properties();
        InputStream inStream = null;
        //プロパティファイルが格納されているパス
        String path = "\\c:\\workspace\\test.properties";
        try {
            inStream = new FileInputStream(path);
            //プロパティファイルを読み込む
            properties.load(inStream);
            //「MASTER_KEY」に紐づく値を取得。
            String masterValue = properties.getProperty("MASTER_KEY");
            //「:」でスプリット
            String[] masterValueArray = masterValue.split(":");
            //スプリットした数だけループ
            for (String CategoryKey : masterValueArray){
                //keyを基にプロパティファイルから値を取得。
                String categoryValue = properties.getProperty(CategoryKey);
                //「:」でスプリット
                String[] keys = categoryValue.split(":");
                //スプリットした数だけループ
                for (String key : keys){
                    //keyを基にプロパティファイルから値を取得。
                    String value = properties.getProperty(key);
                    //keyが「home」から始まる場合
                    if (key.startsWith("home")){
                        System.out.println("私は" + value + "に住んでいます。");
                    //keyが「car」から始まる場合
                    }else if(key.startsWith("car")){
                        System.out.println("私は" + value + "を持っています。");
                    }
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
実行結果は以下のとおりです。
実行結果
私はtokyoに住んでいます。
私はcaliforniaに住んでいます。
私はparisに住んでいます。
私はtoyotaを持っています。
私はteslaを持っています。
私はvolkswagenを持っています。
以上で記事の解説はお終い!
もっとJavaやSpringを勉強したい方にはUdemyがオススメ!同僚に差をつけよう!