enumのちから
前回 : http://assaulter.hatenablog.com/entry/2012/11/24/233948
の続きです。
Javaを本格的に業務で使い出して3ヶ月位なのですが、Javaのメソッドは基本的にクラスのメンバ変数を操作するものというふうに理解しております。
で、なんも考えないでクラスを作ると、メンバ変数が増殖する一方です。
前回のブログで書いたオブジェクト指向養成ギプスによると
- クラスの状態変数は4(理想は1 or 2らしい・・・)
なので、例えば状態変数としてx, yの位置情報を持つ場合はx,yをまとめてPosition等のクラスを作ってコンポジションする方法があります。(件のスライドのテクニック)
今回はそれとは別にJavaのenumを使うと良い感じにまとめられることに気づいたのでメモ書きします。
やりたいこと
- メソッドの実行を、ある条件で切り替えたい
適当に実装するよ
public class Hoge { private HogeInterface hogeInterface; public Hoge(HogeInterface hoge) { this.hogeInterface = hoge; } public enum State { PATTERN_A, PATTERN_B, } public void execute(State state) { switch (state) { case PATTERN_A: hoge.executeA(); break; case PATTERN_B: hoge.executeB(); break; default: break; } } }
うーん。switch文って微妙・・・
こうも書ける
public class Hoge { private static HogeInterface hogeInterface; public Hoge(HogeInterface hoge) { Hoge.hogeInterface = hoge; } public enum State { PATTERN_A { @Override public void execute() { hogeInterface.executeA(); } }, PATTERN_B { @Override public void execute() { hogeInterface.executeB(); } } ; public abstract void execute(); } }
なんとなくそれっぽい!
(注:軽くググってこういう使い方してる記事なかったので、正しいかどうかは保証できません。)
参考記事:http://d.hatena.ne.jp/ashigeru/20090116/1232128313
「定数ごとに匿名クラスブロックをかける」
匿名クラスを適切に書けるようになると、更にJavaを理解できる気がする・・・!