Какая точка использования обозначенных операторов в Java?

Я занят изучением своей сертификации, и я наткнулся на концепцию, о которой я даже не слышал раньше - "Обозначенные заявления". например:

'label': 'statement'

L1: while(i < 0){
     L2: System.out.println(i);
}

Итак, мой вопрос: почему? Как это полезно и когда вы хотите использовать что-то вроде этого?

Ответы

Ответ 1

Единственное, что я знаю, это то, что вы можете использовать метки в операторах break или continue. Поэтому, если у вас есть вложенные циклы, это способ вырваться из более чем одного уровня за раз:

OUTER: for (x : xList) {
          for (y : yList) {
              // Do something, then:
              if (x > y) {
                  // This goes to the next iteration of x, whereas a standard
                  // "continue" would go to the next iteration of y
                  continue OUTER;
              }
          }
       }

Как следует из примера, иногда полезно, если вы повторяете две вещи одновременно вложенным способом (например, поиск совпадений) и хотите продолжить - или если вы делаете обычную итерацию, но по какой-то причине хотите поставить разрыв/продолжить во вложенном цикле for.

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

Ответ 2

Его можно использовать, чтобы избежать необходимости в флаге "не найден".

FOUND: {
  for(Type t: list)
     if (t.isTrue())
        break FOUND;

  // handle not found.
}

Возможно, это неправильное использование меток, но вы можете использовать их для разрыва без цикла.

LABEL: {
    if(condition)
       break LABEL;
    // do something
}

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

http://www.google.com
while(true) break http;

Ответ 3

Я думаю, что они требуются, чтобы вы могли писать Fortran, притворяясь, что пишите Java. Без них афоризм Реальные программисты писать в Fortran на любом языке они могут быть признаны недействительными.

Ответ 4

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

Использование:

scan: {
      int c;
      for (firstUpper = 0 ;
          firstUpper < count ;
          firstUpper += Character.charCount(c)) {
        c = codePointAt(firstUpper);
        if (c != Character.toLowerCase(c)) {
          break scan;
        }
      }
      return this;
    }

Ответ 5

Вот пример чрезмерного break, который, вероятно, будет пропущен остальными ответами. Это позволяет разбить цикл в выражении switch {}:

loop: for(;;){
  int c=in.read();
  switch(c){
  case -1:
  case '\n':
    break loop;
  case 'a':
    processACommand();
    break;
  case ...
  default:
    break;
  }

}

Ответ 6

Как указывали другие ответы, ярлыки редко используются частью языка Java.

Но в вашем случае следует рассмотреть некоторые другие вещи:

  • Этикетки довольно "родовые" и фактически являются номерами строк: L1, L2,...

  • Этикетки не используются в коде.

  • Вы изучаете материал для сертификации.

Это означает, что метки L1, L2 - это просто номера строк. Я предполагаю, что текст, объясняющий код, относится к этим номерам строк. Точно так же в некоторых книгах и документах перечисляются все математические термины только для ссылок на них в тексте или упрощения цитат.