在Java中使用带标签的语句有什么意义?
我正忙着为我的认证学习,我偶然发现了一个我以前从未听过的概念 – “标签声明”。 例如:
‘label’:’声明’
L1: while(i < 0){ L2: System.out.println(i); }
所以我的问题是……为什么? 这有什么用,什么时候想用这样的东西?
我所知道的唯一用途是你可以在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
循环中中断/继续。
不过,我倾向于每隔几年才使用一次。 有一个鸡蛋和鸡蛋,因为它们是一个很少使用的构造,所以很难理解,所以如果代码可以用另一种方式清楚地写,我将避免使用标签。
它可用于避免需要“未找到”标志。
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;
我曾经使用那些作为注释语句:)除了笑话,它就像基本的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; }
这是一个过度break
的例子,可能会被其他回复错过。 它允许在switch {}语句中打破一个循环:
loop: for(;;){ int c=in.read(); switch(c){ case -1: case '\n': break loop; case 'a': processACommand(); break; case ... default: break; } }
我认为它们是必需的,因此您可以在假装编写Java时编写Fortran。 没有它们,格言真正的程序员 在Fortran中写下他们正在使用的语言可能会失效。
正如其他答案所述,标签很少使用Java语言的一部分。
但在你的情况下,应该考虑其他一些事情:
-
标签非常“通用”,实际上是行号:
L1
,L2
,…… -
标签未在代码中使用。
-
您正在学习认证材料。
这意味着, L1
, L2
标签只是行号。 我假设,解释代码的文本是指行号。 同样地,一些书籍和论文列举了所有数学术语,仅仅是为了在文本中引用它们或使引文更容易。