JavaのEnumをループする方法とabstractメソッドを定義する方法
JavaのEnumをループする方法
JavaのEnumにはvalues()というメソッドがあらかじめ用意されています。
Enumを定義します。lombokのAllArgsConstructorアノテーションはEnumで使用するとprivateコンストラクタになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
package jp.co.confrage; import lombok.AllArgsConstructor; import lombok.Getter; @AllArgsConstructor @Getter public enum Sample { APPLE("1"), ORANGE("2"), BANANA("3"); private String param; } |
このEnumをループしたい場合は以下のようにコーディングします。
1 2 3 |
for (Sample a: Sample.values()) { System.out.println(a.getParam()); } |
結果は以下のようになります。
1 2 3 |
1 2 3 |
ストリームを使用してもループは可能です。
1 2 3 |
Arrays.stream(Sample.values()).forEach(r -> { System.out.println(r.getParam()); }); |
結果は以下のようになります。
1 2 3 |
1 2 3 |
Arrays.asListを使用してからストリームにしてmapで値だけとってきてループとかもできます。
1 2 3 |
Arrays.asList(Sample.values()).stream().map(Sample::getParam).collect(Collectors.toList()).forEach(r -> { System.out.println(r); }); |
結果は以下のようになります。
1 2 3 |
1 2 3 |
findAny().isPresent()
で値が存在するかどうかを判断します。
1 |
Boolean flag = Arrays.stream(Sample.values()).filter(r -> r.getParam().equals("3")).findAny().isPresent(); |
filter()でフィルタリングしてfindAny()で要素を返してisPresent()で存在確認することができます。
存在すればtrue,存在しなければfalseです。
JavaのEnumでAbstractメソッドを定義する方法
EnumでAbstractメソッドを定義して実行する方法があります。中小メソッドを定義した場合、各列挙子にその実装メソッドを定義する必要があります。
1 2 3 4 5 6 7 8 |
public enum Sample { APPLE{ public String getStr(String str) { // 定義 return "test" + str; } }; public abstract String getStr(String str); // ここで抽象クラスを定義する } |
これを実際に使うにはEnum型で受けます。
1 2 3 4 5 |
public static void main(String args[]){ Sample a = Sample.APPLE; String ret = a.getStr("aiueo"); System.out.println(ret); // testaiueoと表示される } |
valueOfメソッド
EnumではstaticメソッドとしてvalueOfメソッドが用意されています。StringからEnumへ変換します。Enum値が存在しない文字列を指定した場合は、IllegalArgumentExceptionエクセプションが発生します。
以下、例です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
package jp.co.confrage; public class EnumTtest { public enum Answer { OK, NG } public static void main(String[] args) { Answer answer = Answer.valueOf("OK"); System.out.println(answer.toString()); // OKと表示される System.out.println(Answer.valueOf("NG")); // NGと表示される System.out.println(Answer.valueOf("NGxxx")); // IllegalArgumentException } } |
ordinalメソッド
ordinalメソッドを使用すると、Enumの宣言順を取得することが可能です。基底値は0となります。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
package jp.co.confrage; public class EnumTtest { public enum Answer { OK, NG } public static void main(String[] args) { System.out.println(Answer.OK.ordinal()); // 0と表示される System.out.println(Answer.NG.ordinal()); // 1と表示される } } |
メンバ変数定義
JavaのEnumではメンバ変数を定義することができます。
メンバ変数は定数となるのでfinalを付けます。
コンストラクタはpublicだとエラーとなり、privateコンストラクタを定義して初期化します。
以下例です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
public enum Answer { OK(1), NG(0); private final int answer; // メンバ変数にはfinalをつけること、つけなくてもエラーにはならない // プライベートな引数ありコンストラクタ private Answer(final int answer) { // 定数なのでfinalにする this.answer = answer; }; // getter public int getAnswer() { return this.answer; } } // 実行する public class EnumTtest { public static void main(String[] args) { System.out.println(Answer.OK.getAnswer()); // 1と表示される System.out.println(Answer.NG.getAnswer()); // 0と表示される } } |
これをlombokのアノテーションを使用すると以下のようにボイラープレートコードを省略できます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
public class EnumTtest { public static void main(String[] args) { System.out.println(Answer.OK.getAnswer()); // 1と表示される System.out.println(Answer.NG.getAnswer()); // 0と表示される } } @Getter @RequierdAllArgsConstructor public enum Answer { OK(1), NG(0); private final int answer; // メンバ変数にはfinalをつけること、つけなくてもエラーにはならない } |
EnumをMapクラスで変換
既存システムのjarファイル内に存在するEnumを使用しつつ、新規システムで流用したい。でも少し列挙子の名前が異なる、といった場合にif文で分岐しました。
既存システムのEnum
1 2 3 4 5 6 7 8 9 10 11 12 |
package jp.co.confrage; import lombok.AllArgsConstructor; import lombok.Getter; @AllArgsConstructor @Getter public enum Enum { Saturday("土") Sunday("日"); private String day; } |
新規システムでは、土→土曜、日→日曜としたいとします。(実際の列挙子はもっと多い)
既存システムのjarは修正が出来ない状態でした。if文で書く方法があります。
1 2 3 4 5 6 7 8 9 |
private String getXxx(Strin day) { String ret = null; if (Objects.equals(Enum.Saturday.name(), day)) { // "Saturday" ret = "土曜"; } else if (Objects.equals(Enum.Sunday.name(), day)) { // "Sunday" ret = "日曜"; } return ret; } |
これだと循環的複雑度が上がってしまう為、Mapクラスを作成し、変換してみました。
1 2 3 4 5 6 7 8 9 10 11 |
private String getXxx(Strin day) { Map<String, String> replaceMap = new LinkedHashMap<>() { { put(Enum.Saturday.name(), "土曜"); put(Enum.Sunday.name(), "日曜"); } }; String ret = replaceMap.get(day)); // "Saturday" or "Sunday" return ret; } |
KHI入社して退社。今はCONFRAGEで正社員です。関西で140-170/80~120万から受け付けております^^
得意技はJS(ES6),Java,AWSの大体のリソースです
コメントはやさしくお願いいたします^^
座右の銘は、「狭き門より入れ」「願わくは、我に七難八苦を与えたまえ」です^^