Там є лише один тип твердження "якщо". Інший - умовний вираз. Щодо того, які будуть ефективнішими: вони можуть скомпілюватись до одного і того ж байт-коду, і я би очікував, що вони будуть поводитися однаково - або настільки близько, що ви точно не захочете вибирати одне з іншого з точки зору продуктивності.
Іноді if
вираз буде читабельнішим, інколи умовний оператор буде читабельнішим. Зокрема, я б рекомендував використовувати умовний оператор, коли два операнди прості та не мають побічних ефектів, тоді як, якщо основною метою двох гілок є їх побічні ефекти, я б, мабуть, використав if
твердження.
Ось зразок програми та байт-код:
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;
}
}
Байт-код декомпілюється за допомогою 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
}
Як бачите, тут є невелика різниця в байт-коді - istore_1
відбувається це всередині фігурного дужка чи ні (на відміну від моєї попередньої надзвичайно помилкової спроби :), але я був би дуже здивований, якби JITter опинився з іншим нативним кодом.