Categories: Java

【Java入門】場合分け、条件分岐のコーディング技法

例題

区分(社長、部長、従業員)ごとの給料を取得する処理を考えてみます。
共通コードは以下のとおりとします。

SampleConst.java

package test2;


public class SampleConst {

    /**
     *  社長
     */
    public static final int PRESIDENT = 1;

    /**
     *  部長
     */
    public static final int DIRECTOR = 2;

    /**
     *  社員
     */
    public static final int EMPLOYEE = 3;

    /**
     *  社長の給料
     */
    public static final int PRESIDENT_SALARY = 1000000;

    /**
     *  部長の給料
     */
    public static final int DIRECTOR_SALARY = 500000;

    /**
     *  社員の給料
     */
    public static final int EMPLOYEE_SALARY = 300000;

    /**
     *  デフォルトの給料
     */
    public static final int DEFAULT_SALARY = 100000;
}

条件ごとにIF文で分岐

Java

package test2;

public class SampleIf {

    /**
     *  区分ごとの給料を取得する
     */
    static int getSalary(int kbn){

        //区分が社長の場合、社長の給料を返す。
        if(kbn == SampleConst.PRESIDENT){
            return SampleConst.PRESIDENT_SALARY;
        }

        //区分が部長の場合、部長の給料を返す。
        else if(kbn == SampleConst.DIRECTOR){
            return SampleConst.DIRECTOR_SALARY;
        }

        //区分が従業員の場合、従業員の給料を返す。
        else if(kbn == SampleConst.EMPLOYEE){
            return SampleConst.EMPLOYEE_SALARY;
        }

        //どれにも当てはまらない場合、デフォルト給料を返す。
        return SampleConst.DEFAULT_SALARY;
    }

    //結果確認
    public static void main(String[] args) {
        System.out.println(getSalary(1));   //1000000
        System.out.println(getSalary(2));   //500000
        System.out.println(getSalary(3));   //300000
        System.out.println(getSalary(4));   //100000
    }
}

メリット
  • 誰にでも容易に思いつき、書きやすい


デメリット
  • 区分が増えるごとにIF分岐も増える

三項演算子で分岐する

Java

package test2;

public class SampleTernary {

    /**
     *  区分ごとの給料を取得する
     */
    static int getSalary(int kbn){

        //区分に応じた給料を返す。
        return kbn == SampleConst.PRESIDENT ? SampleConst.PRESIDENT_SALARY: //区分が社長の場合、社長の給料を返す。
                kbn == SampleConst.DIRECTOR ? SampleConst.DIRECTOR_SALARY:  //区分が部長の場合、部長の給料を返す。
                kbn == SampleConst.EMPLOYEE ? SampleConst.EMPLOYEE_SALARY:  //区分が従業員の場合、従業員の給料を返す。
                SampleConst.DEFAULT_SALARY; //どれにも当てはまらない場合、デフォルト給料を返す。
    }

    //結果確認
    public static void main(String[] args) {
        System.out.println(getSalary(1));   //1000000
        System.out.println(getSalary(2));   //500000
        System.out.println(getSalary(3));   //300000
        System.out.println(getSalary(4));   //100000
    }
}

メリット
  • 三項演算子を用いることでIF文よりもstep数が短縮でき、処理が簡潔に書ける


デメリット
  • 三項演算子を嫌うエンジニアが多い。

MAPで分岐

staticイニシャライザでMapを初期化して、区分ごとの給料をセットします。

Java

package test2;

import java.util.HashMap;
import java.util.Map;

public class SampleMap {

    //staticイニシャライザで初期化
    static Map<Integer,Integer> salaryMap = new HashMap<>();
    static{
        salaryMap.put(SampleConst.PRESIDENT,SampleConst.PRESIDENT_SALARY);
        salaryMap.put(SampleConst.DIRECTOR,SampleConst.DIRECTOR_SALARY);
        salaryMap.put(SampleConst.EMPLOYEE,SampleConst.EMPLOYEE_SALARY);
    }

    /**
     *  区分ごとの給料を取得する
     */
    static int getSalary(int kbn){
        //区分に応じた給料を返す。
        return salaryMap.containsKey(kbn) ? salaryMap.get(kbn):
                SampleConst.DEFAULT_SALARY;//どれにも当てはまらない場合、デフォルト給料を返す。
    }

    public static void main(String[] args) {
        System.out.println(getSalary(1));
        System.out.println(getSalary(2));
        System.out.println(getSalary(3));
        System.out.println(getSalary(4));
    }
}

メリット
  • 将来、区分が増えたとしてもMAPを修正すればよく、関数自体に修正が入らない

ポリモーフィズム

samplePoly.java

package test2;

import java.util.HashMap;
import java.util.Map;

abstract class samplePoly {

    /**
     *  給料を取得する
     */
    abstract int getSalary();

    /**
     *  社長クラス
     */
    static class president extends samplePoly{
        int getSalary(){
            return SampleConst.PRESIDENT_SALARY;
        }
    }

    /**
     *  部長クラス
     */
    static class director extends samplePoly{
        int getSalary(){
            return SampleConst.DIRECTOR_SALARY;
        }
    }

    /**
     *  従業員クラス
     */
    static class employee extends samplePoly{
        int getSalary(){
            return SampleConst.EMPLOYEE_SALARY;
        }
    }

    //staticイニシャライザで初期化
    static Map<Integer,samplePoly> salaryMap = new HashMap<>();
    static{

        salaryMap.put(SampleConst.PRESIDENT,new president());
        salaryMap.put(SampleConst.DIRECTOR,new director());
        salaryMap.put(SampleConst.EMPLOYEE,new employee());
    }

    static int getSalary(int kbn){
        //区分に応じた給料を返す。
        return salaryMap.containsKey(kbn) ? salaryMap.get(kbn).getSalary():
            SampleConst.DEFAULT_SALARY; //どれにも当てはまらない場合、デフォルト給料を返す。
    }
}

利用する側のクラスは以下のように書きます。

test1.java

package test2;

public class test1 {

    public static void main(String[] args) {
        System.out.println(samplePoly.getSalary(1));
        System.out.println(samplePoly.getSalary(2));
        System.out.println(samplePoly.getSalary(3));
        System.out.println(samplePoly.getSalary(4));
    }
}

メリット
  • 「給料」以外に要素が増えたとしても対応可能


以上で記事の解説はお終い!

もっとJavaやSpringを勉強したい方にはUdemyがオススメ!同僚に差をつけよう!

issiki_wp