2011年12月9日金曜日

enumってベンリかな

みなさま、こんにちは。
なかなかブログの更新速度があがらないnouzui2007です。
すっかりごぶさたしておりますが、平常運転すぎてあまり気になりませんねw

さて、今回のお題ですが、enumいってみたいと思います。

enumって、列挙型なんて日本語があてられてます。

列挙型

なんか、わかったような気がしてきませんか?
よく知っている表現というのは大切ですねw

これ、なんのために使うかっていうとですねぇ

  • カレンダーの1月から12月を定数にして、まとめておく
  • トランプのスーツ(スペードとかハートとかのあれです)を定数にしておく
  • コーラの種類を定数化したい
とか、みたいな場合に使います。

なんとなくわかったかもしれませんが、

あらかじめ要素数がわかっている定数たちを、まとめておける

のがenumです。

単純なenumは、書き方がCやC++とそっくりです。

enum CocaCola { NORMAL, ZERO,・・・ }

でも内側はちがっていて、Cとかみたいに整数で定数を保持するのではなくて、実態はクラスです。

この列挙型で何がうれしいか。



プログラム中のswitchであつかえる

地味にうれしくなるこの機能ですが、どうでしょう。
分岐は値でやられると、あとで読むとわからなくなるんですよねぇ。
自分で書いててもだめです。
いろいろ覚えていられる期間中は定数化したりするほうが面倒なんですが、いろいろ忘れ始めると「なんだっけ、これ?」の連続です。

覚えていられるうちにenum
ですw


独自のメソッドとか入れられる

単純なenumだと、NORMALとかZEROとかにどんな値が設定されているかは秘密になってます。
でも、それじゃ困る場合もあります。
たとえば、カレンダーでの月をenumにしたい場合、JANUARYを1にしたいですよね。
そんな場合は、メソッドを入れてしまって対応しましょう

enum Calendar {
    JANUARY(1),
    FEBRARY(2),
          ・
          ・
          ・

    private int value;

    private Calendar(int value) {
        this.value = value;
    }

    private int getValue() {
        return this.value;
    }
}

こんな感じにかけちゃいます。

これはベンリ!

参考:







2 件のコメント:

  1. enumでswitchするより、enumにswitch後の処理を実装して、それを呼ぶのが便利です。こんな感じ。
    enum Month {
    January {
    @Override int getValue() { return 1; }
    }
    }

    @Test
    public void testMonth() {
    Month month = Month.valueOf("January");
    assertThat(month.getValue(), is(1));
    }

    返信削除
  2. ほほー、こんなことができるんですね。勉強になりました。
    いつもありがとうございます

    返信削除