カイワレの大冒険 Third

技術的なことや他愛もないことをたまに書いてます

Enum優秀!使い方によって、すごく便利だった件

IDによって処理を分けたいことがありました。そして、僕は単純にCASE文使えばいいだろうと思い、以下のように実装。

switch (id){
case 1:
    hogehoge(user,  array);
    break;
case 2:
    hugahuga(user, array);
    break;
default:
    break;
}

これでいいかなと思ったのですが、その後arrayに対してバリデーションをしたくなったのです。

そうすると、こうなる。

switch (id){
case 1:
    checkLength(array, 3); //ここ追加
    hogehoge(user,  array);
    break;
case 2:
    checkLength(array, 3); //ここ追加
    hugahuga(user, array);
    break;
default:
    log.err("hogehoge")
    break;
}

このように、IDに対する処理が増えるにつれて、ここが肥大化していくとともに、checkLength()でマジックナンバーを使ってしまっている。もうちょっとスマートにかけないかと思ったのです。

そこでEnumの出番というわけです。

こんな感じ。

public enum Id {
    
    // HOGEです
    HOGE(1, 5) {
        @Override
        public void log(String[] arr) {
            Logger.logSample1();
        }
    },
    // HUGAです
    HUGA(2, 4) {
        @Override
        public void log(String[] arr) {
            Logger.logSample2();
        }
    };

    private int id; //ほげほげなんとかのID 
    private int expectedLength; //想定されるリストのlength

    // フィールド2つあるため、定義しないといけない
    Id(int id, int expectedLength) {
        this.id = id;
        this.expectedLength = expectedLength;
    }

    public int getId() {
        return id;
    }

    public int getExpectedLength() {
        return expectedLength;
    }

    public boolean checkLength(String[] array) {
        if (array.length() != this.expectedLength) {
            return false;
        } 
        
        return true;
    }
    
    public abstract void log(String[] arr); 
    
    public static Id create(int id) {
        for (Id id : Id.values()) {
            if (id.getId() == id) {
                return id;
            }
        }
        
        return null;
    }
}

こうすることで、IDに対する処理を隠蔽し、一つにまとめることができました。

あとは使う側から呼び出すだけですね。

Id id = Id.create(someId);
if (!Id.checkLength(contents)) {
    log.error("hoge");
    return;
}

RubyとかPythonやってるとこういう発想にならなかったのですが、Javaやっててこれはすごく便利だなーと思った次第。定数を管理する以外にもすごく可能性がある形式ですね。

是非是非活用してください!ではでは!