Enumのswitch文があやしいのでサンプル作って逆コンしてみる
環境:eclipse3.1.0(win), jre1.5.0_06
// Enum switch サンプル
public class EnumNum {
public enum Num {
ONE, TWO, THREE, FOUR
}
public static void main(String[] args) {
Num num = Num.valueOf(args[0]);
switch (num) {
case ONE:
System.out.println(num.name());
break;
case TWO:
System.out.println(num.name());
break;
case THREE:
System.out.println(num.name());
break;
case FOUR:
System.out.println(num.name());
break;
}
}
}
// Enum 逆コン
public static void main(String args[]){
Num num = Num.ONE;
switch($SWITCH_TABLE$EnumNum$Num()[num.ordinal()])
{
case 0: // '\0'
System.out.println(num.name());
break;
case 1: // '\001'
System.out.println(num.name());
break;
case 2: // '\002'
System.out.println(num.name());
break;
case 3: // '\003'
System.out.println(num.name());
break;
}
}
static int[] $SWITCH_TABLE$EnumNum$Num(){
$SWITCH_TABLE$EnumNum$Num;
if($SWITCH_TABLE$EnumNum$Num == null) goto _L2; else goto _L1
_L1:
return;
_L2:
JVM INSTR pop ;
int ai[] = new int[Num.values().length];
try{
ai[Num.ONE.ordinal()] = 0;
}catch(NoSuchFieldError _ex) { }
try{
ai[Num.TWO.ordinal()] = 1;
}catch(NoSuchFieldError _ex) { }
try{
ai[Num.THREE.ordinal()] = 2;
}catch(NoSuchFieldError _ex) { }
try{
ai[Num.FOUR.ordinal()] = 3;
}catch(NoSuchFieldError _ex) { }
return $SWITCH_TABLE$EnumNum$Num = ai;
}
private static int $SWITCH_TABLE$EnumNum$Num[];
switchを使う場所で、Enum.ordinal()と整合性を取るためのint[]を定義&生成してるようだ
いつもEnum.size()を作ればいいのにと思うけど、何かの仕様があるのだろう…