Enumとswitch文
しばらくぶりの執筆。
書きたいことがなかったので、どうでもいいことを書いてみる。
Enumのswitch文はどのように実現されているかという話です。
元々switch文は、通常tableswitchオペコードが使用されます。
えーと、lookupswitchが使われることもあるんだけど、そこは解説しない。
Enumのswitch文もtableswitchもしくはlookupswitchになると考えて良い。
仕組みとしては、ordinalが使用される。
たぶんコンパイラによって中身が違う可能性があるけど、
eclipseのコンパイラだとsyntheticメソッドとsynthetic変数が使われる。
syntheticを知らない人は多いだろうけど、簡単に言うとコンパイラによって勝手に生成されたってこと。
switch文の前に、syntheticメソッドを呼び出し、intを取ってくる。
switch文に渡すEnumのordinal値を取得。
intに対してそのordinal値を用いてialoadオペコード。
ialoadはint配列から指定インデックスの値を取り出すオペコードだ。
さて、intを返すsyntheticメソッドが何をしているかというと、
Enumのvalues()から、ordinal値を詰めたintを作成して、
synthetic変数にストアしつつ、それを返す。
synthetic変数に落とし込むのは、複数回呼ばれた場合のスピードアップのためだろう。
Java7のString Switchについては特に調べてないが、
hashCode()でtableswitch/lookupswitchしてから、
その先でequals()を呼び出す仕組みになるだろう。
ただ、equals()でfalseになった場合、defaultにgotoしないといけない。