Yeap, lo hace, porque en términos generales una instrucción switch funciona más rápido que if/else chain.
Aunque el bytecode generado no siempre es una fuente definitiva para las comparaciones de rendimiento, puede examinarlo para tener una mejor idea.
Por ejemplo, este código:
class A {
enum N { ONE, TWO, THREE }
void testSwitch(N e) {
switch(e) {
case ONE : x(); break;
case TWO : x(); break;
case THREE : x(); break;
}
}
void testIf(Enum e) {
if(e == N.ONE) { x(); }
else if(e == N.TWO) { x(); }
else if(e == N.THREE) { x(); }
}
void x(){}
}
genera los siguientes:
Compiled from "A.java"
class A extends java.lang.Object{
A();
Code:
0: aload_0
1: invokespecial #1; //Method java/lang/Object."<init>":()V
4: return
void testSwitch(A$N);
Code:
0: getstatic #2; //Field A$1.$SwitchMap$A$N:[I
3: aload_1
4: invokevirtual #3; //Method A$N.ordinal:()I
7: iaload
8: tableswitch{ //1 to 3
1: 36;
2: 43;
3: 50;
default: 54 }
36: aload_0
37: invokevirtual #4; //Method x:()V
40: goto 54
43: aload_0
44: invokevirtual #4; //Method x:()V
47: goto 54
50: aload_0
51: invokevirtual #4; //Method x:()V
54: return
void testIf(java.lang.Enum);
Code:
0: aload_1
1: getstatic #5; //Field A$N.ONE:LA$N;
4: if_acmpne 14
7: aload_0
8: invokevirtual #4; //Method x:()V
11: goto 39
14: aload_1
15: getstatic #6; //Field A$N.TWO:LA$N;
18: if_acmpne 28
21: aload_0
22: invokevirtual #4; //Method x:()V
25: goto 39
28: aload_1
29: getstatic #7; //Field A$N.THREE:LA$N;
32: if_acmpne 39
35: aload_0
36: invokevirtual #4; //Method x:()V
39: return
void x();
Code:
0: return
}
que parece ser bastante rápido en ambos casos.
Elija el que sea más fácil de mantener.
Dudo mucho que la diferencia de rendimiento sea algo más que la micro optimización. Me decantaría por el conmutador stmt si proporciona un código más legible y fácil de mantener en su caso. – CoolBeans
Tengo curiosidad, ¿qué te hace decir "estoy bastante seguro de que una instrucción de cambio que usa Enums funcionaría más rápido que una declaración if-then-else"? – Pops
@Lord Torgamus: en una instrucción de conmutación, cada caso es verdadero o falso, en una instrucción if-then-else, cada uno si podría tener múltiples valores booleanos, es decir, this && that, o esto || eso, etc. Y me imagino que evaluar más de uno llevaría un poco más de tiempo. – FizzBuzz