J'étais juste un peu par ce comportement et cette question a montré lors de Googler. J'ai pensé que je devais partager le peu d'informations supplémentaires, je l'ai découvert.
javac 1.5 et 1.6 créer un nouveau synthétique de la classe chaque fois que vous utilisez un commutateur sur un enum. La classe contient un soi-disant "changer de carte" google maps enum indices pour passer de la table de saut numéros. Surtout, le synthétique, la classe est créée pour la classe dans laquelle la commutation se produit, pas la classe enum.
Voici un exemple de ce qui est généré:
EnumClass.java
public enum EnumClass { VALUE1, VALUE2, VALUE3 }
EnumUser.java
public class EnumUser {
public String getName(EnumClass value) {
switch (value) {
case VALUE1: return "value 1";
// No VALUE2 case.
case VALUE3: return "value 3";
default: return "other";
}
}
}
Synthétique EnumUser$1.class
class EnumUser$1 {
static final int[] $SwitchMap$EnumClass = new int[EnumClass.values().length];
static {
$SwitchMap$EnumClass[EnumClass.VALUE1.ordinal()] = 1;
$SwitchMap$EnumClass[EnumClass.VALUE3.ordinal()] = 2;
};
}
Ce commutateur de la carte est ensuite utilisé pour générer un index pour un lookupswitch
ou tableswitch
de la JVM de l'instruction. Il convertit chaque valeur d'enum dans un index correspondant de 1 à [numéro de l'interrupteur d'affaires].
EnumUser.class
public java.lang.String getName(EnumClass);
Code:
0: getstatic #2; //Field EnumUser$1.$SwitchMap$EnumClass:[I
3: aload_1
4: invokevirtual #3; //Method EnumClass.ordinal:()I
7: iaload
8: lookupswitch{ //2
1: 36;
2: 39;
default: 42 }
36: ldc #4; //String value 1
38: areturn
39: ldc #5; //String value 3
41: areturn
42: ldc #6; //String other
44: areturn
tableswitch
est utilisé s'il y a trois ou plus de l'interrupteur cas qu'il effectue plus efficace constante de temps de recherche vs lookupswitch
's la recherche linéaire. Techniquement parlant javac pourrait omettre toute cette affaire avec le synthétique de changer de carte quand il utilise lookupswitch
.
La spéculation: je n'ai pas l'Éclipse du compilateur sous la main pour tester, mais j'imagine que ça ne dérange pas avec une synthèse de la classe et utilise simplement lookupswitch
. Ou peut-être qu'il exige plus de commutateur de cas que l'original asker testé avec avant de "ugprades" pour tableswitch
.