Вот тест для развлечения с тройной оператор:Java байткод iconst_0 iadd последовательность
public int so(final int a) {
int r = (int) System.currentTimeMillis();
r += a == 2 ? 1 : 0;
return r;
}
Вот байткодом производства:
public int doIt(int);
Code:
0: invokestatic #2; //Method java/lang/System.currentTimeMillis:()J
3: l2i
4: istore_2
5: iload_2
6: iload_1
7: iconst_2
8: if_icmpne 15
11: iconst_1
12: goto 16
15: iconst_0
16: iadd
17: istore_2
18: iload_2
19: ireturn
Я был немного удивлен, увидев, что она не устранила «else» для «+ 0». Я еще ожидал этого:
public int doIt(int);
Code:
0: invokestatic #2; //Method java/lang/System.currentTimeMillis:()J
3: l2i
4: istore_2
5: iload_1
6: iconst_2
7: if_icmpne 13
10: iinc 2, 1
13: iload_2
14: ireturn
Так вот идет мой вопрос: делает спецификации санкционирует:
goto ...
iconst_0
последовательность, потому что я использовал тройной оператор, или это просто компилятор thinggy?
Очевидно, что этот вопрос не касается релевантности написания «r + = ...? 1: 0 '. Но я удивлен, потому что в других случаях компилятор делает некоторую оптимизацию, в то время как здесь он не делает никакой оптимизации.
Может ли Java-компилятор, производящий вариант 2, быть действительным Java-компилятором (в случае, если я не применил свой пример, но дело в том, что в создаваемом коде есть ненужное добавление 0 и ненужное goto компилятор, удаляющий это, все еще является допустимым компилятором .java)?
@Lauri: Proguard интегрирован в наш процесс сборки, поэтому я рассмотрю его из любопытства – SyntaxT3rr0r