在Java中退出循环

时间:2011-03-09 13:16:17

标签: java coding-style

我正在使用Java,但我想这个问题适用于任何语言。我只想问一下,使用布尔值退出循环是更好的做法,我在循环中切换或只使用break;

例如,我只是在写一种方法来获得国际象棋中女王的有效动作。

private static final int[][] DIRS = {{0, 1}, {0, -1}, {1, 0}, {-1, 0}, {1, 1}, {-1, -1}, {-1, 1}, {1, -1}};

public Vector<Move> getValidMoves() {
    Vector<Move> validMoves = new Vector<Move>();

    for (int i = 0; i < DIRS.length; i++) {
        boolean stopped = false;
        int newX = x + DIRS[i][0];
        int newY = y + DIRS[i][1];
        while (!stopped && newX >= 0 && newX < 8 && newY >= 0 && newY < 8) {
            if (board[newX][newY] == null) {
                validMoves.add(new Move(x, y, newX, newY));
                newX += DIRS[i][0];
                newY += DIRS[i][1];
            } else {
                if (board[newX][newY].getColour() == colour) {
                    stopped = true;
                } else {
                    validMoves.add(new Move(x, y, newX, newY));
                    stopped = true;
                }
            }
        }
    }

    return validMoves;
}

如果我使用break退出while循环;而不是像我这样设置停止为真,这是我的理解,它运行更有效,但不是最好的代码风格。

10 个答案:

答案 0 :(得分:13)

break存在是出于循环的唯一原因,我想不出更好的方法来做到这一点。

答案 1 :(得分:8)

性能方面,没关系,你在堆栈上分配1个布尔值,并在每次循环迭代时添加1个比较,所以没什么好担心的。

它主要取决于您是否要在退出之前完成剩余的循环代码。 Break将立即退出并设置一个布尔值将在停止之前等待下一次迭代。

如果您不需要完成循环迭代,那么使用break

时,您的代码将更容易阅读

答案 2 :(得分:2)

由于这里使用布尔变量对性能影响不大,这与可读性有关。有些人认为使用break语句会降低代码的可读性,原因有两个。

一个是当使用break语句时,用户有时无法顺序读取代码(需要跳转读取)。这可能会令人困惑,因为读者需要确定break语句带来下一个操作的位置。

另一件事是使用变量作为停止条件有助于读者理解为什么在有意义地命名变量时它会被停止。例如,如果你对停止条件使用isEmpty布尔变量,很明显循环已经停止,因为无论什么是空的。

我并不反对使用break语句,但我认为你应该做的是尽可能让它变得可读。

答案 3 :(得分:1)

我建议你做你认为最清楚的事。恕我直言使用布尔值可以更清楚地嵌套循环,但对于使用标志的简单循环是不必要的详细。

while (0 <= newX && newX < 8 && 0 <= newY && newY < 8) {
    if (board[newX][newY] == null) {
        validMoves.add(new Move(x, y, newX, newY));
        newX += DIRS[i][0];
        newY += DIRS[i][1];
    } else {
        if (board[newX][newY].getColour() != colour) 
            validMoves.add(new Move(x, y, newX, newY));
        break;
    }
}

答案 4 :(得分:1)

明确使用休息。这就是关键字的用途,它会生成更简洁的代码,不会让某人阅读您的代码,不知道循环中的“停止”来自何处,并且可能更快。

答案 5 :(得分:1)

取决于你与谁交谈。我有一位大学教授发誓,他会用正常的表情检查来拍摄任何没有退出控制结构的学生(例如一个循环)。

然而,我已经看到,尽管可能是“纪律严明”,但有时候提前退出循环或其他控制结构是可取的。考虑到这一点,我说“去吧”。您仍然可以遵守纪律,并且具有早期退出时没有意外行为的可读代码(只要该退出是离开该结构的正当理由。

答案 6 :(得分:1)

这就是为什么语言中有中断的原因。我会用它。

答案 7 :(得分:1)

与上述用户一样,绝对使用break。退出循环是它的目的。

答案 8 :(得分:1)

似乎尚未提出的一点:

在Java中(虽然不是唯一的),退出嵌套循环将使用break 更多优雅,而不是在每个级别嵌套相同的条件。它还可以使代码更易于维护。

此外,它可以使循环的逻辑变得更加简单,因为只要你达到破坏状态,你就可以采取行动,而不是继续执行代码。这也促进了循环体内的模块化。

答案 9 :(得分:1)

您可能想要从oracle网页上了解break的用法

Branching Statements Tutorial

使用Break来退出循环是一种很好的做法。然后,如果你使用或不使用取决于你。

现在,如果您想提高代码的可读性及其灵活性,可以考虑将复杂的循环分解为函数。