Можно ли использовать блок LABEL без цикла? - PullRequest
5 голосов
/ 21 декабря 2009

Можно ли использовать блок LABEL без цикла? Есть примеры?

Ответы [ 5 ]

15 голосов
/ 21 декабря 2009

Здесь - пример использования меток и операторов разбиения без цикла:

        block1: {
            if (a < 0) {
                break block1;
            }
            if (b < 0) {
                break block1;
            }
            return a + b;
        }
4 голосов
/ 13 марта 2013

Но зачем использовать метку на блоке кода?

Моим приложением обычно является переключение на строковую переменную (или что-либо, кроме char, byte, short, int, Enum).

«Чтобы приготовить омлет, нужно разбить несколько яиц»

Пример:

String key = "scrambled";
eggs: {
    if ("do-nothing".equals(key)) break eggs;
    if ("scrambled".equals(key)) {
        ;//scramble code here
        break eggs;
    }
    if ("fried".equals(key)) {
        ;//fry code here
        break eggs;
    }
    //default behaviour goes here
    //or maybe throw an exception
}

Хорошо, хорошо, «Иногда, чтобы приготовить омлет, нужно убить несколько человек»

Альтернативы:

  • Java 7 позволяет String в качестве переключателя.
  • Обходной путь Enum с использованием MyEnum.valueOf (str) можно заставить работать.
  • Переключатель на строке (или Хэш-код объекта) плюс еще if-then-else if возможно, но будет иметь смысл только для многих возможностей, в этом случае Вероятно, все дело в капитальном ремонте.
4 голосов
/ 21 декабря 2009
  public static void main(String[] args)
  {
    hello: break hello;
  }
2 голосов
/ 21 декабря 2009

, конечно:

private boolean isSafe(String data) {

    validation: {

        if (data.contains("voldemort")) {
            break validation;
        }
        if (data.contains("avada")) {
            break validation;
        }
        if (data.contains("kedavra")) {
            break validation;
        }
        return true;
    }
    return false;
}

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

    label1: for (int i = 0; i < 4; i++) {
        for (int j = 0; j < 4; j++) {
            System.out.println(i + " " + j);
            if (i == j) {
                continue label1;
            }
        }
    }

производит:

0 0
1 0
1 1
2 0
2 1
2 2
3 0
3 1
3 2
3 3
0 голосов
/ 21 декабря 2009

Если вам нужен нечитаемый код:

int i = 1;
int j = 1;
label: switch (i) {
case 1:
    switch (j) {
    case 1:
        break label;
    }
default:
    System.out.println("end");
}

Без break; будет напечатано «конец». break label; пропустит печать.

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