Solo hay un tipo de declaración "si" allí. La otra es una expresión condicional. En cuanto a cuál funcionará mejor: podrían compilarse en el mismo código de bytes, y esperaría que se comporten de manera idéntica, o tan cerca que definitivamente no querrá elegir uno sobre el otro en términos de rendimiento.
A veces, una if
declaración será más legible, a veces el operador condicional será más legible. En particular, recomendaría usar el operador condicional cuando los dos operandos sean simples y sin efectos secundarios, mientras que si el propósito principal de las dos ramas son sus efectos secundarios, probablemente usaría una if
declaración.
Aquí hay un programa de muestra y un código de bytes:
public class Test {
public static void main(String[] args) {
int x;
if (args.length > 0) {
x = 1;
} else {
x = 2;
}
}
public static void main2(String[] args) {
int x = (args.length > 0) ? 1 : 2;
}
}
Bytecode descompilado con javap -c Test
:
public class Test extends java.lang.Object {
public Test();
Code:
0: aload_0
1: invokespecial #1
4: return
public static void main(java.lang.String[]
Code:
0: aload_0
1: arraylength
2: ifle 10
5: iconst_1
6: istore_1
7: goto 12
10: iconst_2
11: istore_1
12: return
public static void main2(java.lang.String[
Code:
0: aload_0
1: arraylength
2: ifle 9
5: iconst_1
6: goto 10
9: iconst_2
10: istore_1
11: return
}
Como puede ver, hay una ligera diferencia en istore_1
el código de bytes aquí, ya sea que ocurra dentro del brance o no (a diferencia de mi intento anterior con grandes fallas :) pero me sorprendería mucho si el JITter terminara con un código nativo diferente.