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やっててこれはすごく便利だなーと思った次第。定数を管理する以外にもすごく可能性がある形式ですね。
是非是非活用してください!ではでは!