自己参照するenumはまともに動かない

正確には、「その行時点で宣言されていないenumメンバを指定するとnull扱いになってしまう」。

下記コードでは、

  • StateTransition.S0.next = null
  • StateTransition.S1.next = null
  • StateTransition.S2.next = StateTransition.S0

となっていて、まぁまともに動いてくれるとは言いがたい状況です。

思想としてはアリかなと思わないでもないですが、それならコンパイル時点でエラー扱いにしてくれよとも思ったり。この辺りが静的チェックの限界なのかなぁ。

public enum StateTransition {
	S0(StateTransition.S1), //StateTransition.S1 is null
	S1(StateTransition.S2), //StateTransition.S2 is null
	S2(StateTransition.S0); //StateTransition.S0 is not null
	
	final StateTransition next;
	
	private StateTransition (StateTransition next){
		this.next = next;
	}
	
	public static void main(String[] args) {
		StateTransition s = StateTransition.S0;
		System.out.println(s);     //prints "S0"
		System.out.println(s = s.next); //prints "null"
		System.out.println(s = s.next); //throws NullPointerException
	}
}