在Java中使用标签打破了一个良好的习惯?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (17)

并且遇到了这样的说法:

   else {
     do {
       int c = XMLDocumentFragmentScannerImpl.this.scanContent();
       if (c == 60) {
         XMLDocumentFragmentScannerImpl.this.fEntityScanner.scanChar();
         XMLDocumentFragmentScannerImpl.this.setScannerState(1);
         break label913:
       }

我从来没有选择过这个,并且在这里发现了一些标签:

http://docs.oracle.com/javase/tutorial/java/nutsandbolts/branch.html

这不是基本的功能goto吗?使用它甚至是好习惯吗?这让我感到不安。

提问于
用户回答回答于

不,它不像goto,因为你不能“去”到控制流程的另一部分。

从您链接的页面:

break语句终止带标签的语句; 它不会将控制流转移到标签上。控制流被转移到紧随标签(已终止)语句之后的语句。

这意味着你只能打破当前正在执行的循环。

考虑这个例子:

first:
for( int i = 0; i < 10; i++) {
  second:
  for(int j = 0; j < 5; j ++ )
  {
    break xxx;
  }
}

third:
for( int a = 0; a < 10; a++) {

}

你可以xxxfirstor 替代second((打破外部或内部循环),因为两个循环都在执行,当你点击break语句时,替换xxxthird无法编译。

用户回答回答于

这并不是太可怕,goto因为它只是将控件发送到标签语句的末尾(通常是一个循环结构)。令人感到goto不可思议的事情是,它是任意位置的分支,包括在方法源中找到更高的标签,以便您可以拥有本地生成的循环行为。Java中的标签中断功能不允许这种疯狂,因为控制只能向前发展。

在这种情况下,我需要摆脱嵌套循环,更多结构的替代方案可能会让循环中的测试更加复杂。我不会建议大量使用它,但我不会将其标记为自动坏码气味。

扫码关注云+社区