きどたかのブログ

いつか誰かがこのブログからトラブルを解決しますように。

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しないといけない。