Почему я должен дать имя Заявлению If? - PullRequest
4 голосов
/ 05 февраля 2011

Я только что обнаружил, что могу дать имя операторам For и While.Я понимаю, что это полезно, если вы хотите прервать или продолжить определенный цикл.
Но почему я должен давать имя If ??Выглядит бесполезно

name: if(true){
    //do something
}

компилируется без проблем

Ответы [ 4 ]

10 голосов
/ 05 февраля 2011

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

name: if(true) {
    // do something
    if(/* condition */) {
        break name;
    }
    // do more
}

он также работает без if:

name: {
    // do something
    if(/* condition */) {
        break name;
    }
    // do more
}

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

Еще один пример, где альтернативные структуры труднее читать и изменять:

block: if(/* guard */) {

  // prep work

  if(/* guard */) {
    break block;
  }

  // prep work

  if(/* guard */) {
    break block;
  }

  // real work
}

, хотя обычно я использую пустой блок, а не if.

6 голосов
/ 05 февраля 2011

Вы можете использовать метки перед любым блоком операторов. Это, возможно, чаще всего используется для циклов, но отлично подходит для других.

2 голосов
/ 05 февраля 2011

Sarah Happy * Ответ 1002 * на самом деле более правильный, чем мой, показывая, что вы можете использовать break для разбиения блоков кода, в дополнение к циклам, поэтому я предлагаю посмотреть на ее ответ.


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

goto name;

Хотя goto является зарезервированным словом, Java не поддерживает goto, но поддерживает его в форме помеченных циклов в сочетании с break и continue.

Если вы расширили пример кода, включив в него переход, например:

 name: if(true){
    //do something
  }
 goto name;

Вы получите сообщение об ошибке: illegal start of expression и not a statement

В качестве альтернативы, если вы пытались использовать continue с вашим ярлыком, но без цикла, например:

 name: if(true){
    //do something
  }
 continue name;

Вы получите undefined label: name

Таким образом, с точки зрения компилятора, иметь метку без цикла - это нормально, но без цикла она практически бесполезна.

0 голосов
/ 05 февраля 2011

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

...