Java入門:Enum型

Java Logo

かなり前に追加されたJavaのEnum型。1回勉強したのだが、すっかり忘れてしまった。なぜか覚えられない。。もう一度 再勉強である。

シンプルなEnum型

Enum型を定義するだけなら、列挙子を定義するだけ。swtch文でも比較できる。

Sample/Main.java at master · eiKatou/Sample

enum Status {
  SUCCESS, ERROR
}
Status status = Status.SUCCESS;
switch (status) {
  case SUCCESS:
    System.out.println("SUCCESS");
    break;
  case ERROR:
    System.out.println("ERROR");
    break;
  default:
    break;
}

Enum型に値を持たせる

ここから先が曖昧な知識となっていたところ。

enumの中に好きな値を持たせることができる。コンストラクタはprivateで定義する。また、自身で定義したメソッドでコードを取得できる。

サンプルコードはこんな感じ。

enum Status2 {
  SUCCESS(0), ERROR(1);
  private final int code;

  private Status2(int code) {
    this.code = code;
  }

  public int getCode() {
    return this.code;
  }
}
Status2 status2 = Status2.ERROR;
System.out.println("name:" + status2.name());
System.out.println("code:" + status2.getCode());
System.out.println("toString:" + status2.toString());
switch (status2) {
  case SUCCESS:
    System.out.println("SUCCESS");
    break;
  case ERROR:
    System.out.println("ERROR");
    break;
  default:
    break;
}

実行結果

name:ERROR
code:1
toString:ERROR
ERROR

Enum型のメソッド実装

Enum型の列挙子にメソッドを実装できる。

enum Status3 {
  SUCCESS(0) {
    @Override
    public String getPrintCode() {
      return "<p class='ok'>" + getCode() + "</p>";
    }
  }, ERROR(1) {
    @Override
    public String getPrintCode() {
      return "<p class='error'>" + getCode() + "</p>";
    }
  };

  abstract public String getPrintCode();
  // その他コードは省略
}

Enum型に値を持たせるのは良い

Enum型に値を持たせることに違和感があったけど、よく考えると良いアイデアだと思う。定数を型として扱えるわけで、良いことしか思いつかない。

複数の値を持たせることができるのだが、3個以上の値を持たせるのはやりすぎだと思う。1つの列挙型に3つも値を持つことなんてあるだろうか。せいぜい2つもあればいいところじゃないかな。同様にメソッドを複数持たせることもやりすぎな気がしている。それならクラスを使えよ、って思う。

投稿日 2017年10月22日