Murayama blog.

プログラミング教育なブログ

EnumでStateパターン的なものの真似

Enumについて調べてたら面白い使い方が紹介されていたので真似してみました。
J2SE 5.0 Tiger 虎の穴 Typesafe Enum

package en1;

public enum Signal {
	BLUE {
		@Override
		public Signal next() {
			return YELLOW;
		}

		@Override
		public void doSomething() {
			System.out.println("blue doSomething");
		}
	},
	YELLOW {
		@Override
		public Signal next() {
			return RED;
		}

		@Override
		public void doSomething() {
			System.out.println("yellow doSomething");
		}
	},
	RED {
		@Override
		public Signal next() {
			return BLUE;
		}

		@Override
		public void doSomething() {
			System.out.println("red doSomething");
		}
	};

	abstract Signal next();

	abstract void doSomething();

	public static void main(String[] args) {
		Signal signal = BLUE;
		signal.doSomething(); // => blue doSomething
		signal.next().doSomething(); // => yellow doSomething
		signal.next().next().doSomething(); // => red doSomething
		signal.next().next().next().doSomething(); // => blue doSomething
	}
}

で、考察。
Enumはabstarctメソッドを定義できるってのがまず新鮮でした。
各定数ごとにメソッドを実装できるのが面白いです。
上記のサンプルは信号機をイメージして、青=>黄=>赤=>青・・・と状態を変化させています。
(nextメソッドで次の状態を返すようにしています)