首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在Java中使用带标签的break是一种好的做法吗?

在Java中使用带标签的break是一种好的做法吗?
EN

Stack Overflow用户
提问于 2013-02-19 22:53:54
回答 4查看 66K关注 0票数 89

我看了一些2001年的旧代码,发现了下面这句话:

代码语言:javascript
复制
   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一样工作吗?使用它是一种很好的实践吗?这让我感到不安。

EN

回答 4

Stack Overflow用户

发布于 2013-02-19 22:59:03

它不像goto那么可怕,因为它只将控制发送到标记语句的末尾(通常是循环结构)。让goto不讨人喜欢的是,它是一个任意分支,可以到达任何地方,包括方法源代码中更高层的标签,这样您就可以拥有自己的循环行为。Java中的标签中断功能不允许这种疯狂,因为控制只向前移动。

我在大约12年前只使用过一次,在我需要打破嵌套循环的情况下,更结构化的替代方案将在循环中进行更复杂的测试。我不建议经常使用它,但我也不会把它标记为自动的坏代码气味。

票数 16
EN

Stack Overflow用户

发布于 2015-05-24 16:25:04

用新方法替换break总是有可能的。

考虑对两个列表中的任何公共元素进行代码检查:

代码语言:javascript
复制
List list1, list2;

boolean foundCommonElement = false;
for (Object el : list1) {
    if (list2.contains(el)) {
        foundCommonElement = true;
        break;
    }
}

你可以像这样重写它:

代码语言:javascript
复制
boolean haveCommonElement(List list1, List list2) {
    for (Object el : list1) {
        if (list2.contains(el)) {
            return true;
        }
    }
    return false;
}

当然,要检查两个列表之间的公共元素,最好在具有O(n)额外内存的O(n)中使用list1.retainAll(new HashSet<>(list2))方法,或者在O(n * log n)中对两个列表进行排序,然后在O(n)中找到公共元素。

票数 10
EN

Stack Overflow用户

发布于 2018-12-17 21:26:32

表达意图的一种更清晰的方式是,至少在我看来,将包含循环的代码片段放入一个单独的方法中,并简单地从该方法中执行return

例如,更改以下内容:

代码语言:javascript
复制
someLabel:
for (int j = 0; j < 5; j++)
{
    // do something
    if ...
        break someLabel;
}

如下所示:

代码语言:javascript
复制
private void Foo() {
    for (int j = 0; j < 5; j++)
    {
        // do something
        if ...
            return;
    }
}

对于精通其他语言(或future you)的开发人员来说,这也更适合将来使用您的代码。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14960419

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档