在循环中间返回

时间:2016-02-13 11:41:30

标签: java return

我必须编写一个函数来从链表中删除一个元素(我的,而不是集合框架的元素),所以这是我的第一次尝试:

public void remove(E element) {
    Cell<E> cell = sentinel;
    int i = 0;
    while (i < count) {
        if (cell.getElement().equals(element)) {
            cell.getPrevious().setNext(cell.getNext());
            --count;
            return;
        }
        ++i;
        cell = cell.getNext();
    }
}

我的问题是:使用return这样好吗? 更一般地说,当检查条件并且没有指示运行以下指令时,我使用return是有意义的:

void func() {
    while (condition) {
        if (something) {
            instructions;
            return;
        }
        more instructions;
    }
}

但是因为它不是很易读,而且每个人都说可读性是java的优先考虑,所以我不得不考虑另一种方法。所以我改变了条件并使用了一个额外的布尔值。

public void remove(E element) {
    boolean found = false;
    Cell<E> cell = sentinel;
    int i = 0;
    while (!found && i < count) {
        if (cell.getElement().equals(element))
            found = true;
        else {
            ++i;
            cell = cell.getNext();
        }
    }
    if (found) {
        cell.getPrevious().setNext(cell.getNext());
        --count;
    }
}

通过这种方式,没有奇怪的return,并且仅在必须执行时才执行指令。如果我再次遇到这种情况,我想我将不得不重新编写这样的循环。 也许我完全错了,第一种方法更好。你觉得怎么样?

3 个答案:

答案 0 :(得分:5)

在我看来,如果不是太复杂的话,早点返回是完全没问题的。类似于使用break语句提前摆脱循环。

你可以在程序员看一下这个问题,他们每个都提出有效的观点。 https://softwareengineering.stackexchange.com/questions/18454/should-i-return-from-a-function-early-or-use-an-if-statement

答案 1 :(得分:1)

功能中的单独逻辑,有些只读取,有些只改变状态。如果你有一个find-something函数,很清楚在搜索过程中返回

例如

public void remove(E element) {
    Cell<E> cell = FindCell(element);
    if (cell != null)
        RemoveCell(cell);
}

private <E> FindCell(E element) {
    <E> cell = sentinel;
    int i = 0;
    while (i < count) {
        if (cell.getElement().equals(element)) {
            return cell;
        }
        ++i;
        cell = cell.getNext();
    }

    return null;
}

private void RemoveCell(<E> cell) {
    cell.getPrevious().setNext(cell.getNext());
    --count;
}

这种分离给你一些好处。您可以根据需要多次调用只读函数(可能是并行线程),您肯定知道没有任何反应。例如,C ++具有const函数

当你需要打破两个或多个嵌套循环时,返回非常方便

答案 2 :(得分:0)

这完全是一个选择问题,他们提出的任何一种方法都没有错,只需记住两件事。

  

如果您不想在该特定方法的循环外执行其余代码并返回给调用者,则可以使用返回。

     当你不想执行时,可以使用

布尔true or false   循环,但你仍然想继续其余的代码   那种方法。