2010-02-25
Effective Java 読書会 8 日目 「それ enum で出来るよ」
はじめに
今日読んだところ
143 ページ〜 159 ページ
前回はこちら
Effective Java 読書会 7 日目 「PECS! PECS! PECS!」 - IT戦記
int 定数とか使わない
型安全じゃないから
enum 使う
enum Hoge {
FOO, BAR;
}
簡単
メソッドも持てる
enum Hoge { FOO, BAR; void a() { /* (snip) */ } }
で、以下のように使う
Hoge.FOO.a();
シングルトンも
switch 文の代わりに固有メソッド
enum Hoge { FOO { void a() { /*snip*/ } }, BAR { void a() { /*snip*/ } }; abstract void a(); }
以下のコードが
// これはダメ switch(obj) { case Hoge.FOO: /*snip*/ break; case Hoge.BAR: /*snip*/ break; default: throw new AssertionError(); }
以下で良くなる!
// case の書き忘れもなくて安心!
obj.a();
戦略 enum
enum の値をカテゴライズする
// たとえば enum Hoge { FOO { void a() { /*snip*/ } }, // これと BAR { void a() { /*snip*/ } }, // これがまったく同じ処理だったとして BAZ { void a() { /*snip*/ } }; abstract void a(); }
以下のようになる
enum Hoge { FOO(Strategy.STRATEGY_1), BAR(Strategy.STRATEGY_1), BAZ(Strategy.STRATEGY_2); private enum Strategy { STRATEGY_1 { void a() { /* ... */ } }, STRATEGY_2 { void a() /* ... */ } abstract void a(); } // 戦略の委譲 private final Strategy strategy; Hoge(Strategy strategy) { this.strategy = strategy; } void a() { strategy.a(); } }
values 便利
for (Hoge v : Hoge.values()) { /* ... */ }
ordinary は使うのはやめましょう
値が増えるとコンパイルの度に順番変わるので
private で id 的なフィールドを持てと
EnumSet 便利!
64 個までならビット演算(|)と比べても遜色のない速度で動く!テラすごす!!
Set<Hoge> set = EnumSet.of(Hoge.FOO, Hoge.BAR, Hoge.BAZ); // ビット演算 FOO (=0x1) | BAR (=0x1 << 1) | BAZ (=0x1 << 2) と比べても遜色のない速度で動く
of メソッドかっけー!
EnumMap も便利
Enum の ordinal をインデックスにした配列じゃなく EnumMap を使おう
まとめ
enum すげー便利!めっちゃ使う!
次回はこちら
トラックバック - http://d.hatena.ne.jp/amachang/20100225/1267114471
リンク元
- 245 http://b.hatena.ne.jp/hotentry
- 193 http://b.hatena.ne.jp/hotentry/it
- 186 http://reader.livedoor.com/reader/
- 100 http://www.google.co.jp/reader/view/
- 89 http://pipes.yahoo.com/pipes/pipe.info?_id=faa858a20082ef6d25ad27557e37e011
- 84 http://b.hatena.ne.jp/entry/d.hatena.ne.jp/amachang/20100225/1267073381
- 79 http://nplll.com/mutter/archives/2009/03/ie8ie8ie7ie6.php
- 77 http://www.google.com/reader/view/
- 75 http://twitter.com/
- 74 http://pipes.yahoo.com/pipes/pipe.info?_id=3eebace824bb60a10f13c841c2c64478

