Альтернатива оператору перехода в Java

Что такое альтернативная функция для goto ключевого слова в Java?

Так как Java не имеет goto.

83
задан Peter Mortensen 21 January 2014 в 21:01
поделиться

4 ответа

Вы можете использовать оператор с пометкой BREAK :

search:
    for (i = 0; i < arrayOfInts.length; i++) {
        for (j = 0; j < arrayOfInts[i].length; j++) {
            if (arrayOfInts[i][j] == searchfor) {
                foundIt = true;
                break search;
            }
        }
    }

Однако в правильно спроектированном коде вам не нужна функциональность GOTO.

82
ответ дан 24 November 2019 в 08:49
поделиться

В Java нет прямого эквивалента концепции goto . Есть несколько конструкций, которые позволяют делать некоторые вещи, которые вы можете делать с классическим goto .

  • Операторы break и continue позволяют вам выйти из блока в операторе цикла или switch.
  • Оператор с меткой и break позволяют вам перейти из произвольного составного оператора на любой уровень в рамках данного метода (или блока инициализатора).
  • Если вы пометите оператор цикла, вы можете continue , чтобы продолжить следующую итерацию внешнего цикла из внутреннего цикла.
  • Создание и перехват исключений позволяет (эффективно) выпрыгивать из многих уровней вызова метода. (Однако исключения являются относительно дорогими и считаются плохим способом выполнения «обычного» потока управления 1 .)
  • И, конечно же, есть return .

Ни одна из этих конструкций Java не позволяет выполнить переход назад или к точке кода на том же уровне вложенности, что и текущий оператор. Все они выпрыгивают из одного или нескольких уровней вложенности (области видимости), и все они (кроме continue ) прыгают вниз. Это ограничение помогает избежать синдрома «спагетти-кода» перехода, присущего старым кодам BASIC, FORTRAN и COBOL 2 .


1- Самая дорогая часть исключений - это фактическое создание объекта исключения и его трассировки стека.Если вам действительно действительно нужно использовать обработку исключений для «нормального» управления потоком, вы можете либо предварительно выделить / повторно использовать объект исключения, либо создать собственный класс исключения, который переопределяет метод fillInStackTrace () . Обратной стороной является то, что методы исключения printStackTrace () не дадут вам полезной информации ... если вам когда-нибудь понадобится их вызвать.

2 - Синдром спагетти-кода породил подход структурного программирования , при котором вы ограничивали использование доступных языковых конструкций. Это можно было применить к BASIC , Fortran и COBOL , но это требовало осторожности и дисциплины. Полное избавление от goto было прагматически лучшим решением. Если вы сохраните это на языке, всегда найдется какой-нибудь клоун, который будет злоупотреблять этим.

42
ответ дан 24 November 2019 в 08:49
поделиться

Просто для удовольствия, здесь является реализацией GOTO на Java.

Пример:

 1 открытый класс GotoDemo {
 2 общедоступных статических пустых main(String[] args) {
 3 int i = 3;
 4 System.out.println(i);
 5 i = i - 1;
 6 если (i >= 0) {
 7 GotoFactory.getSharedInstance().getGoto().go(4);
 8 }
 9 
 10 проб {
 11 System.out.print(«Ад»);
 12, если (Math.random() > 0) создать новое исключение(); 
 13 System.out.println("Мир!");
 14 } catch (Исключение e) {
 15 System.out.print("o");
 16 GotoFactory.getSharedInstance().getGoto().go(13);
 17 }
 18 }
 19 }

Запуск:

$ java -cp bin:asm-3.1.jar GotoClassLoader GotoDemo 
 3
 2
 1
 0
 Всем привет!

Нужно ли добавлять "не используйте!"?

30
ответ дан 24 November 2019 в 08:49
поделиться

Если вам действительно нужно что-то вроде операторов goto, вы всегда можете попробовать перейти к именованным блокам.

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

namedBlock: {
  if (j==2) {
    // this will take you to the label above
    break namedBlock;
  }
}

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

5
ответ дан 24 November 2019 в 08:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: