【问题标题】:Java - return or if-else [duplicate]Java - return 或 if-else [重复]
【发布时间】:2012-01-10 12:50:51
【问题描述】:

可能重复:
Should a function have only one return statement?

这就是我要说的。

if (condition) {
    aVariable = 1;
    return;
}
doSomething();

if (condition) {
    aVariable = 1;
} else {
    doSomething();
}

其中一个是否优于另一个(约定等)?

【问题讨论】:

标签: java coding-style


【解决方案1】:

提前返回可以通过减少代码中的嵌套来提高可读性。

在某些语言中,最好使用单个 return 语句,例如在 C++ 中,您应该在方法的顶部分配并在底部取消分配,但 Java 不是这样的语言,因此更喜欢可读性而不是单个返回语句。

许多人使用单一返回规则是因为他们不明白它为什么存在,或者因为他们有托管语言的背景。

请注意

在您评论编写代码的“一种真正的方式”之前,请暂停片刻并考虑以下内容。

为什么必须只有一个 return 语句?

如果您想不出一个好的理由,请停止争论应该是这种情况。

【讨论】:

  • 我认为开发 java 的人不知道这一点:P。因为在java中的“大多数”*代码中,最后都有return语句。 * 我在JDK中看到的代码
  • @nidhin - 创建 Java 的人使返回任何地方成为可能,他们不强制执行此“单次返回”规则。试着去想“为什么会有一个单一的回报”,看看你能想到什么原因。开发人员需要根据具体情况决定是使用嵌套还是提前返回,而可读性是最好的衡量标准。
  • 基本上你不应该通过使用提前返回来提高代码的可读性。如果你这样做了 - 你的代码已经是一团糟,提前返回也无济于事......很多。
  • @user1075261 通过“单次返回”,我们的意思是该方法只在一个地方退出,不一定使用 return 语句,因为在这个问题中它在结束时返回(或者如果你在方法中添加额外的 return 语句)。
  • @user1075261 - 它在托管语言中很有用,因为您关心内存的分配和取消分配。出于这个原因,通常对方法进行仔细排序,最后返回语句。
【解决方案2】:

可读性是最重要的。 所以在函数开始的早期返回是可以的,但是一旦方法开始做一些比检查它的输入/对象状态更复杂的事情,它应该只有一个返回。

而且如果太复杂,应该重构为多个函数。

【讨论】:

  • 使用 -1 因为我通常更喜欢 return 语句而不是执行 if/switch 语句的代码,只是为了到达方法的结尾。一旦事情变得复杂,我当然完全赞成重构。此外,错误的输入应该导致异常,而不是提前返回。这在答案中还不够清楚。
  • Bad input -> 异常,但有时会有琐碎的输入-> 琐碎的返回(例如1!= 1)。
【解决方案3】:

第二个是首选,因为方法应该只有一个 return 语句,并且它必须在方法本身的末尾。 如果您想深入了解该主题,有许多程序可以对您的代码进行验证。其中之一是PMD。还有一个有用的 eclipse 插件来验证您的代码是否符合您正在寻找的约定。

【讨论】:

  • 话虽如此,我有时不同意并使用第一个,当我认为它更容易理解时;)
【解决方案4】:

点击返回后,方法结束并返回堆栈中的调用方法。

public void myMethod(){
if (condition) {
    aVariable = 1;
    return;
}
doSomething();
}

public void myMethod(){
if (condition) {
    aVariable = 1;
} else {
    doSomething();
}
}

会做同样的事情,但 AFAIK 任何方法都首选只有一个退出点(至少 Edsger Dijkstra 是这么说的)

【讨论】:

    【解决方案5】:
    1. 为最佳实践,return 语句应位于最后一行 功能

    2. 使用 else 块是个好方法,因为如果你想在以后添加一些其他代码,第一个代码块可能需要编辑

    注意:所有方法都有其优点和缺点。他们不是Silver bullet 解决方案。

    【讨论】:

    • 这是一个非常绝对的声明。很多时候,提前返回会阻止复杂的嵌套控制流,因此比单次返回更可取。
    • @MarkRotteveel:不是这样。如果您在使用“最后一行返回”样式时发现代码结构过于复杂和嵌套 - 这意味着您需要重构代码。通常这意味着将验证移出业务逻辑或类似的东西。
    • 如果你有“无意义”的 else(如果 where 是 return 子句,没有别的),Eclipse 实际上会发牢骚。
    • 我同意马克的观点。绝对遵守诸如“最后只返回一个”或“不要跳过循环”之类的规则会导致代码复杂。但是,“打破”这些规则的原因必须是可读性和可理解性,而不是程序员的懒惰。
    • @Max 如果您使用在大多数情况下不会复杂的标准编写方法,因为方法中的行数应该最少。例如。 JDK 源代码
    【解决方案6】:

    不,您可以同时使用这两种方式。 当您有许多其他条件时也使用第一种方式,并且 return 会将您从方法中移出。这样你就没有嵌套条件了。

    【讨论】:

      【解决方案7】:

      任一代码 sn-p 都可以。这将取决于使用代码的上下文。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-02-05
        • 1970-01-01
        • 2013-09-10
        • 2015-10-28
        • 2012-03-05
        • 2018-12-05
        • 2012-02-29
        相关资源
        最近更新 更多