この前ハマったので、備忘録メモ。
http://stackoverflow.com/questions/6435267/java-enum-static-final-instance-variables
EnumをEnum名(.name())とは別の特定のキーから逆引きできるコードを書きたくて、以下のように書いてみました。
import java.util.HashMap; |
すると、こんなエラーが出ました。
Cannot refer to the static enum field MyEnum.lookupMap within an initializer
コンストラクタ内でstatic変数を参照しているのがNGのようです。
通常のクラスの場合、staticイニシャライザが最初に実行されるのですが、
Enumの場合は、staticイニシャライザよりもinstanceのコンストラクタの方が先に実行されるようです。
というわけで、こう書きます。
import java.util.HashMap; |
もしくは、InnerClassでHolderクラスを作ります。こっちの方がスマートですね。
この場合、Holder#static{}
が一番最初に呼び出されるので、MyEnumコンストラクタから直接参照できるわけです。
import java.util.HashMap; |
初期化順序確認コード
Enumと普通のクラスの初期化順を確認するコードです。
public class InitOrderTest { |
classの場合は、static -> {} -> ()
という順番に対して、Enumの場合は、{} -> () -> static
という順番になっています。
main |