2015-07-01 3 views
4

Каковы различия между этим:короткое замыкание против Multiple если это

if(a && b) 
{ 
    //code 
} 

и это:

if(a) 
{ 
    if(b) 
    { 
      //code 
    } 
} 

Из того, что я знаю b только получить оценку в первом блоке кода, если a верно , а второй блок кода будет одним и тем же.

Есть ли преимущества использования одного над другим? Время выполнения кода? Память? и т. д.

+0

Почему вы заботитесь о времени выполнения или памяти? Это орехи. Это явный случай, когда человек, вероятно, будет более чистым и понятным, чем другой. Почему вы даже думаете о микро-оптимизации? Единственными оптимизациями, которые должны выполняться в отсутствие доказанной необходимости, являются алгоритмические оптимизации. –

+0

@ DavidSchwartz хорошо, что вам нужно выбрать один, он может быть лучшим, если по какой-либо причине, даже если это просто читаемость кода, не обязательно время выполнения. – Aequitas

+0

Точно. Поэтому забудьте о времени выполнения кода или памяти. Какой бы ни была более четкая формулировка, цель программиста должна быть выбрана. –

ответ

0

Если в вашем втором примере нет ничего между двумя операциями if, тогда, безусловно, сначала один более чистый и читаемый.

Но если есть кусок кода, который может вписываться между двумя условиями if, то единственным примером является только способ.

+0

, если у вас есть код, который должен работать после a, но до b, вы можете поместить его в метод c, который возвращает true. то вы можете использовать нотацию короткого замыкания a && c() && b – emory

0

не должно быть разницы, но в читабельности я предпочел бы первый, потому что он менее подробный и менее отступы.

8

Они скомпилированы на тот же байт-код. Нет разницы в производительности.

Считываемость - единственная разница. Как огромное обобщение, короткое замыкание выглядит лучше, но вложенность немного яснее. Это действительно сводится к конкретному варианту использования. Я обычно замыкался.


Я попробовал это. Вот код:

public class Test { 

    public static void main(String[] args) { 
     boolean a = 1>0; 
     boolean b = 0>1; 

     if (a && b) 
      System.out.println(5); 

     if (a) 
      if (b) 
       System.out.println(5); 
    } 
} 

Это компилирует:

0: iconst_1 
    1: istore_1 
    2: iconst_0 
    3: istore_2 
    4: iload_1 
    5: ifeq   19 
    8: iload_2 
    9: ifeq   19 
12: getstatic  #2 
15: iconst_5 
16: invokevirtual #3 
19: iload_1 
20: ifeq   34 
23: iload_2 
24: ifeq   34 
27: getstatic  #2 
30: iconst_5 
31: invokevirtual #3 
34: return 

Обратите внимание, как этот блок повторяется дважды:

4: iload_1 
    5: ifeq   19 
    8: iload_2 
    9: ifeq   19 
12: getstatic  #2 
15: iconst_5 
16: invokevirtual #3 

Same байткод оба раза.

4

Это имеет значение, если у вас есть еще, связанный с каждым , если.

if(a && b) 
{ 
    //do something if both a and b evaluate to true 
} else { 
    //do something if either of a or b is false 
} 

и это:

if(a) 
{ 
    if(b) 
    { 
      //do something if both a and b are true 
    } else { 
      //do something if only a is true 
    } 
} else { 
    if(b) 
    { 
      //do something if only b is true 
    } else { 
      //do something if both a and b are false 
    } 
} 
+0

Очень хорошая точка. +1. –

Смежные вопросы