はじめに
保守・開発でプログラムに触れる際、その8割はソースコードを読む時間に費やされるというのはよく聞く話です。
そのため、可読性の高く、保守性の高いソースコードというのは常に意識されるべきですが、どうしても業務システムとなると、ある契約の種類だとか、取引先の種類だとか、種類による条件分岐がどうしても多くなりがちだと感じています。
そこで、if文を少なくなるする方法の1つとしての、Enumを使用した方法があるということを知ったので、忘れないように投稿します。
if文を少なくするメリット
if文による条件分岐が多い場合、Enumを使用することでとても読みやすくなります。
具体例
public enum SampleEnum {
kind1(new Kind1()),
kind2(new Kind2()),
kind3(new Kind3()),
kind4(new Kind4());
SuperKind kind;
private SampleEnum(SuperKind kind) {
this.kind = kind;
}
public void execute(Object obj) {
kind.execute(obj);
}
}
まずはEnumを用意します。
次に、各プロパティに対して、実行したい処理クラスを記載し、コンストラクタを定義します。
最後に、実行したい処理クラスの実行メソッドを定義します。
Enum自体は、この3ステップで実装完了です。
あとは、種類が追加された場合は、プロパティを追加して、その種類ごとに実行したい処理クラスを記載するだけです。
public class Kind1 implements SuperKind {
public void execute(Object obj){
if(!(obj instanceof String)) {
System.out.println("引数には文字列を指定してください");
}
System.out.println("Kind1のクラスで" + obj);
}
}
実行したい処理クラスです。
ここでは簡単に、そのクラスで実行されたことがわかる文を、コンソールに出力するようにします。
SuperKindは、interfaceです。ここでは中身はexecute
メソッドを定義しているだけなので、割愛します。
public class Main {
public static void main(String[] args) {
SampleEnum test1 = SampleEnum.valueOf("kind1");
SampleEnum test2 = SampleEnum.valueOf("kind2");
SampleEnum test3 = SampleEnum.valueOf("kind3");
SampleEnum test4 = SampleEnum.valueOf("kind4");
String string = "Enumのテスト";
test1.execute(string);
test2.execute(string);
test3.execute(string);
test4.execute(string);
}
}
mainクラスです。ここで実行した結果は、以下の通りになります。
Kind1のクラスでEnumのテスト
Kind2のクラスでEnumのテスト
Kind3のクラスでEnumのテスト
Kind4のクラスでEnumのテスト
最後に
このような実装をすることで、Factoryクラスでのif文判定を減らすこともできれば、どの業務ロジック処理を呼び出すかなどのif文判定を減らしたりなど、活用の幅は大きいかと感じました。