Что делает цепочечная конструкция if в Java? - PullRequest
0 голосов
/ 30 октября 2018

После прочтения курса Oracle iLearning Java у меня сложилось впечатление, что использование «цепочки if конструкции» эквивалентно использованию оператора «&&». Итак:

 if((5 < 10) && (5 < 6)) {
    run some code;
}

совпадает с:

if(5 < 10) {
  if(5 < 6) {
        run some code;
    }
}

Сравнивая их, мне трудно в это поверить. Я думаю, что меня очень неправильно поняли.

Ответы [ 5 ]

0 голосов
/ 31 октября 2018

Очевидно, что 5 меньше 6 и 10 в любой день, поэтому ваш код будет выполняться в обоих случаях, потому что вы можете заменить условия на

 if(true)

Или удалите его

0 голосов
/ 31 октября 2018

Два пути похожи, но они не одинаковы. Давайте подумаем об отдельных случаях:

В первом случае, используя оператор and, вы получаете:

if(conditionOne && conditionTwo){
   //do something if both conditions are true
}

В другом случае у вас есть:

if(conditionOne){
   if(conditionTwo){
      //do something of both conditions are true
   }
   //here you know that condition one is true but condition two is false
}

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

0 голосов
/ 30 октября 2018

Если вы не знаете, что происходит под капотом, у JDK есть очень мощный инструмент под названием javac . Просто скомпилируйте эти 2 класса и сравните их байт-код (на этот раз я сделал это для вас). Итак, первый

public class YouCantAvoidNullPointerLikeThat {
    public static void main(String[] args) {
        if((5 < 10) && (5 < 6)) {
            //run some code;
        }
    }
}

дает вам этот байт-код

javap -c YouCantAvoidNullPointerLikeThat.class
Compiled from "YouCantAvoidNullPointerLikeThat.java"
public class YouCantAvoidNullPointerLikeThat {
  public YouCantAvoidNullPointerLikeThat();
    Code:
       0: aload_0
       1: invokespecial #1                  // Method java/lang/Object."<init>":()V
       4: return

  public static void main(java.lang.String[]);
    Code:
       0: return
}

И следующий пример:

public class YouCantAvoidNullPointerLikeThat {
    public static void main(String[] args) {
        if(5 < 10) {
            if(5 < 6) {
                //run some code;
            }
        }
    }
}

дает вам байт-код как

javap -c YouCantAvoidNullPointerLikeThat.class
Compiled from "YouCantAvoidNullPointerLikeThat.java"
public class YouCantAvoidNullPointerLikeThat {
  public YouCantAvoidNullPointerLikeThat();
    Code:
       0: aload_0
       1: invokespecial #1                  // Method java/lang/Object."<init>":()V
       4: return

  public static void main(java.lang.String[]);
    Code:
       0: return
}

Так что да, результат этих 2 равен

0 голосов
/ 30 октября 2018

Ваши примеры эквивалентны:

Во-первых:

if (someCondition && otherCondition) {
     //some code
}

Второе:

if (someCondition) {
     if(otherCondition) {
        //some code
     }
}

Второй пример называется сворачиваемым оператором if и должен быть объединен в качестве первого примера для повышения читабельности кода.

Сонар: правило о «разборных операторах if»

0 голосов
/ 30 октября 2018

Мы можем переписать этот код как:

if(someCondition)` {
    if(otherCondition) {
        //code
    }
}

Таким образом, someCondition и otherCondition должны быть истинными для запуска //code. (Ключевое слово И). Таким образом, в данном случае if(someCondition && otherCondition) эквивалентен приведенному выше коду


Обычно причина, по которой вы используете вложенные if, заключается в том, что вы хотите проверить несколько условий, таких как:

if(someCondition) {
   if(otherCondition1) {
      //code
   }
   else if(otherCondition2) {
     //code
   } else {
     //else
   }
}
...