例題
区分(社長、部長、従業員)ごとの給料を取得する処理を考えてみます。
共通コードは以下のとおりとします。
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がオススメ!同僚に差をつけよう!