Надлежащее использование многоуровневого перерыва в Java - PullRequest
3 голосов
/ 25 июня 2010

Я недавно кодировал небольшую Java-программу (как дизайн для программы 8086 Assembler) и оказался в интересной позиции - мне нужно было выйти из цикла while из внутреннего оператора switch, что-то вроде этого (очевидно, псевдокод):

:MyLoop
While(foo)
    switch (bar)
       case '1': print '1'; break
       case '0': print '0'; break
       case ';': end while loop;

Казалось, что это идеальное место для оператора goto, потому что один "break" мог бы только выйти из оператора switch (особенно учитывая, что я проектировал для сборки), но Java имеетнет gotos!

Вместо этого я обнаружил, что в Java есть нечто, называемое многоуровневым разрывом, поэтому при использовании «break MyLoop» программа вырвалась бы из обоих вариантов переключения и цикла while.'

Мой вопрос - является ли это подходящим использованием многоуровневого перерыва?Если по какой-то причине я хотел сохранить оператор switch (вместо, скажем, вложенного оператора if ifs), есть ли альтернативный способ имитировать многоуровневый разрыв с помощью «break» или «continue» в одиночку?

Ответы [ 3 ]

12 голосов
/ 25 июня 2010

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

Я лично нахожу это более понятным в большинстве случаев - но в остальном, это именно та вещь, для которой обозначены разрывы.Обычно это чище (IMO), чем иметь отдельную переменную boolean, указывающую, продолжать ли цикл.

2 голосов
/ 25 июня 2010

Ответ Джона Скита в коде:

public void doSomething() {
    while(foo) {
        switch (bar) {
            case '1': print '1'; break;
            case '0': print '0'; break;
            case ';': return; //Effectively exits the loop
        }
    }
}
2 голосов
/ 25 июня 2010

это правильное использование многоуровневого перерыва?

Да.

существует ли альтернативный способ имитации многоуровневого перерыватолько через "break" или "continue"?

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

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