Java中的多重返回语句

Shi*_*rty 6 java

private void test() {           
        // Nested if block 
        if (true) { // If condition is true
            if (true) { // If condition is true
                if (true) { // If condition is true
                    if (true) { // If condition is true
                         // statement
                    }
                }
            }
        }

        // Above block breaking in below way
        // Breaking nested if in multiple with return statement
        if (false) { // If condition is false
            return;
        }

        if (false) { // If condition is false
            return;
        }

        if (false) { // If condition is false
            return;
        }

        if (false) { // If condition is false
           return;
        }
    }
Run Code Online (Sandbox Code Playgroud)

OOPs提出多个return语句不是一个好主意。但是如果我使用了多个嵌套的话,那么它看起来就很复杂了。请提出在条件下使用嵌套的最佳方法是什么

dav*_*xxx 5

多个return语句本身不是好是坏。
尽早返回和快速失败原理不是不好的编码方式,但是它们依赖于多个return语句。
一件事情很重要:一致性和代码可读性。

您的第二种方法使用“早期回报”模式:

if (false) { // If condition is false
    return;
}

if (false) { // If condition is false
    return;
}

if (false) { // If condition is false
    return;
}

if (false) { // If condition is false
   return;
}
Run Code Online (Sandbox Code Playgroud)

现在,没有什么可以通过删除重复来阻止您改进此代码: if (...) returns ...;
实际上,由于噪声和规则分散,滥用它们确实可能会产生难以阅读的代码。

您的示例确实过于抽象,无法提供具体答案。
因此,假设您的多个条件语句依赖于要评估的特定类的对象。

在这种情况下,您可以将条件语句存储在List中并对其进行迭代以应用每个规则。一旦无效,则退出。

List<Predicate<MyObject>> predicates = Arrays.asList(MyObject::isValid, 
                                                    (m)-> m.getColor()==BLUE);
Run Code Online (Sandbox Code Playgroud)

现在应用规则:

MyObject myObj = ...;
for (Predicate<MyObject> predicate : predicates) {
    if (!predicate.test(myObj)) {
      return false;
    }
}
Run Code Online (Sandbox Code Playgroud)


Gho*_*ica 2

明白没有什么规则是一成不变的。(软件)工程总是要平衡不同的需求/规则。

对于您的情况:选项 2,使用多个 return 语句显然对于人类读者来说更容易理解。

从这个意义上说:去做吧。因为这个解决方案在单层抽象原则方面也表现得更好!

但我也同意这些评论 - 冗长的 if/else 检查序列通常是设计不足的症状。人们不需要完全放弃ifs (请参见此处) - 但假设您主要关心的是提高当前代码的质量,您应该花时间研究这个问题,为什么该方法中有这么多 if 语句