ボクココ

個人開発に関するテックブログ

Java の enum 再入門。enumがあると何が嬉しいのか

ども@kimihomです。 enum って案外使わなくても何とかなる場合が多くて、今ままであまり使ってこなかった方は多いのではないでしょうか? しかし、このenumはソースの可読性を向上させる上で、知らなくてはならないテクニックの1つだと思います。そこで今日はenumの使い方についておさらいしましょう。

今回は Android アプリ開発におけるよくあるパターンを紹介します。

enum は定数間の関係を定義できる

まず、enum が嬉しいのはこれが個人的に最も大きいです。 例えばアプリ内に「称号」の概念があったとします。称号には名前があり、称号の説明があり、何レベルから何レベルまでの間が、その称号であるかがわかるようにしたい、といった所です。

これをenumを使わないとなると、DTO の List を作るのが一般的な所でしょうか。 リストに詰めるときにそれぞれの順番を正しくやる必要があるのが気持ち悪いですね。

class DegreeDto {
  private String name;
  private String description;
  private int minLv;
  private int maxLv;

  /* getter and setter */
}

class Hoge {
  String[] names = {"degree1", "degree2", "degree3};
  String [] descs = {"beginner", "medium", "advance"};
  int[] minLvs = {1, 5, 10};
  int[] maxLvs = {5,10, 100};
  
// for で回して DegreeDto 作ってlist に入れる
}

enumを使わないでやるとなるとまずパッと思いつく方法かと思います。人によっては何かをKeyにしてHashMap にしたりすると思いますが、称号のケースだとvalueに入れるのがnameやminLvなど複数いるので結局DTOを作らないといけなくなります。

enum を使ってみる

さて、そうした定数間の関係をきれいさっぱり定義できるのがenumさんです。

こんな感じになります。

enum Degree {
  degree1("degree1", "beginner", 1, 5),
  degree2("degree2", "medium", 5, 10),
  degree3("degree3", "advance", 10, 100);

  private final String name;
  private final String description;
  private final int minLv;
  private final int maxLv;

  /** getter */

  private Degree(String name, String description, int minLv, int maxLv) {
    this.name = name;
    this.description = description;
    this.minLv = minLv;
    this.maxLv = maxLv;
  } 
}


for(Degree degree : Degree.values()) {
  degree.getName();
  degree.getMaxLv();
  //...
}

こんな感じです。 enum により、定数間の関係がとても簡潔に書けたことがおわかりでしょうか。 Degreeはオブジェクトとして扱えるので、イテレートも普通にリストを回すかのように簡単です。 Degree.values()でDegreeを配列として返してくれるので、定義するだけで配列の中に関連する要素が簡単に取って来れます。

終わりに

こうしたenumを使ってクリーンなコードで書いた アプリ、 ストイック 、絶賛 Google Play で公開中でございますw

Google Androidプログラミング入門 改訂2版