2007/02/07

JavaのEnumのswitch文は$SWITCH_TABLEメソッド?

javaのパフォーマンスを測ってたら、$SWITCH_TABLE*なる妙なメソッドがあったのでちょっと調査

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()を作ればいいのにと思うけど、何かの仕様があるのだろう…

2007/02/02

Vista UpgradeのAdviseをしてくれない…

自分のPCはVistaに対応できるかなっと♪試してみたら



「Windows Vista Upgrade Advisor で、システムのスキャン中にエラーが発生しました。問題が解決しない場合は、Windows Vista Upgrade Advisor をアンインストールして、最新バージョンを再インストールしてください。」

…というか最新ですが?

WindowsUpdate(高速・カスタム全部)して、
アンインストール、再起動、再インストールしたらなぜか動いた!?

その後も↑のダイアログがでたりでなかったり…

気になる結果は、3つ指摘を受けました
・HDDの容量があと15G足りん!
・DVD付けろ!
・ビデオカードがしょぼい!

そんなこと言われてもな…