【8/27まで】Udemyの人気コースが今なら1,200円から!!

【Java入門】プロパティファイルにキーを追加してもコード修正をしなくて済む方法

【Java入門】プロパティファイルにキーを追加してもコード修正をしなくて済む方法

ソースコードに情報を持たせず外部に持たせれば、情報が更新されてもコード修正せずにアプリ改修が可能だって言うけど、プロパティファイルにキーを追加したら、そのキーを使って値を取得するためのコードを書く必要があるんじゃないの?
こんな疑問に答えます!

考え方

プロパティファイルはキー=値の組で情報を保持するファイルです。

キーを定義したら値を持たせなくちゃ!
実は、この考え方が落とし穴だったのです。
値を書く場所だからといって値を書く必要はないんです。別のキーを値として持たせれば良かったんです。
ということでサンプルコードを見てみましょう。

サンプルコード

以下のプロパティファイルは、KEY1KEY2KEY3に国の名前を持たせ、
そのキー(KEY1KEY2KEY3)を:で連結して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側で:でスプリットします。
その結果KEY1KEY2KEY3に分割されます。
Java側でこの文字列をキーとして再度プロパティファイルにアクセスします。
こうすることでKEY1KEY2KEY3に対応したJapanAmericaChinaが取得できるという仕組みです。

キーを増やしたくなったら

このプロパティファイルにキーを増やしたくなったとしましょう。
例えば、フランスの情報を追加したくなったら以下のようにtest.propertiesを修正します。

test.properties


MASTER_KEY=KEY1:KEY2:KEY3:KEY4
KEY1=Japan
KEY2=America
KEY3=China
KEY4=France

まず、フランスの情報としてKEY4=Franceを定義します。
次に、キーであるKEY4MASTER_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を持っています。

コメントを残す

メールアドレスが公開されることはありません。