15

我正忙于学习我的认证,我偶然发现了一个我以前从未听说过的概念——“标签声明”。例如:

“标签”:“声明”

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

所以我的问题是……为什么?这有什么用,什么时候想要使用这样的东西?

4

6 回答 6

25

我知道的唯一用途是您可以在breakorcontinue语句中使用标签。因此,如果您有嵌套循环,这是一种一次突破多个级别的方法:

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循环中中断/继续。

不过,我倾向于每隔几年才使用一次。有一个先有鸡还是先有蛋的问题,因为它们是一种很少使用的构造,因此很难理解,因此如果可以以另一种方式清楚地编写代码,我将避免使用标签。

于 2012-08-22T10:17:32.200 回答
21

它可用于避免需要“未找到”标志。

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;
于 2012-08-22T10:45:16.223 回答
2

我认为它们是必需的,这样您就可以在假装编写 Java 的同时编写 Fortran。没有它们,无论他们使用什么语言,真正的程序员 用 Fortran 编写的格言都可能失效。

于 2012-08-22T10:18:43.120 回答
2

我曾经将这些用作注释语句 :) 除了笑话,它就像基本的 Go to 语句,它允许您跳转到一行代码,即在深度循环结构中......

用法:

scan: {
      int c;
      for (firstUpper = 0 ;
          firstUpper < count ;
          firstUpper += Character.charCount(c)) {
        c = codePointAt(firstUpper);
        if (c != Character.toLowerCase(c)) {
          break scan;
        }
      }
      return this;
    }
于 2012-08-22T10:21:30.803 回答
2

break这是其他回复可能会遗漏的过度示例。它允许在 switch{} 语句中打破循环:

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

}
于 2012-08-22T10:51:21.907 回答
0

正如其他答案所述,标签是 Java 语言中很少使用的部分。

但在你的情况下,应该考虑其他一些事情:

  • 标签非常“通用”,实际上是行号:L1, L2, ...

  • 代码中不使用标签。

  • 您正在学习认证材料。

这意味着,L1标签L2只是行号。我假设,解释代码的文本是指该行号。同样,一些书籍和论文列举所有数学术语只是为了在文本中引用它们或使引用更容易。

于 2012-08-25T13:00:39.220 回答