【问题标题】:Why 'condition && statement()' is not popular in Java world? [closed]为什么 'condition && statement()' 在 Java 世界中不流行? [关闭]
【发布时间】:2016-07-22 10:51:14
【问题描述】:

在 Javascript 世界中(尤其是在 React 应用程序中)我见过像 [2] 这样的表达式。但是,在 Java 中,这并不那么流行。

1.

if(isValid) {
   statement();
}
isValid && statement();

[1] 和 [2] 的结果相同,因为 statement() 不会被评估 if isValid == false

  • 为什么像 [2] 这样的语法不流行?我的意思是,我以前在我见过的任何 Java 项目中都没有遇到过这种情况。
  • 方法 [2] 有什么影响吗?
  • 它被认为是有害的吗?
  • 使用它作为简单的if 语句的替代方案,我会不会有什么惊喜?
  • 它会降低可读性吗?

编辑:

我在Groovy 控制台中对此进行了测试。我想它使这个问题非常无效。无论如何感谢您的回复。

【问题讨论】:

  • 好吧,Java 语言不支持它。 为什么它不支持它是基于意见的 ;-)
  • 我不明白这里的赞成票。如果它重新标记为 Groovy,我可能会删除我的反对意见 - 但我对十年 Java 经验产生的问题有点失望。
  • 在我看来,如果您编写代码来讲述故事,那么无参数的 void 方法会很好。否则,我强烈建议您花时间遵循 OOP 原则并从严格的设计模式中受益:)
  • does it decrease readability? - 是的!在isValid && a()isValid || a 中,哪一个又做了什么?您必须考虑短路是如何工作的 - 而如果是自然语言 if A then B - 没有比这更自然和可读的了! - 为什么要浪费所有这些努力?

标签: java boolean readability


【解决方案1】:

if( isValid && statement() ) 仅在 statement() 返回 boolean 时有效,否则条件将无法编译。这样做可能不被认为是好的设计(取决于statement 实际做了什么)并且可能会降低可读性或您使用statement() 的返回值的能力。

除了只是 isValid && statement(); 不受该语言支持 - 并且不要将 Java 之类的语言与 JavaScript 之类的语言进行比较,它们遵循不同的范例。

可以执行boolean b = isValid && statement(); 之类的操作,但通常只有在您想以某种方式使用b 的值时才会这样做。

编辑:KRyan 的要求,我还将添加一段关于a && b 的含义以及它在Java 和JavaScript 中的用途(虽然我不是专家在这里)。

Java

一般来说,您可以使用& (and) 或| (or) 组合两个布尔表达式。因此true & true 将导致truetrue | false,但true & false 将导致false 等。

单字符运算符的问题在于,即使您已经知道结果,每个 参数也会被计算。例如,当您看到 false & ... 时,您已经知道在查看第一个参数时结果是 false,任何其他参数都不会产生影响。

现在,如果您有一个表达式调用了一些返回布尔值的方法,如果不需要它们,您可能不想执行这些方法,例如当方法本身非常昂贵时。以needsCheckWebsite & isValueOnWebsite( "test" ) 为例。 isValueOnWebsite( "test" ) 可能需要一段时间,如果 needsCheckWebsite 为假,您就不想执行该方法。

要解决此问题,您可以使用双字符运算符 &&||,也就是短路运算符。这意味着如果您编写 needsCheckWebsite && isValueOnWebsite( "test" ) 并且如果 needsCheckWebsite 为 false,则不会发生昂贵的 isValueOnWebsite( "test" ) 执行,因为我们已经知道结果不会改变任何事情。

因此isValid && statement() 意味着statement() 仅应在isValid 时执行。

JavaScript

JavaScript 中的 AFAIK 短路运算符以类似的方式工作,因为它计算第一个参数,如果结果仍然未知,则计算并返回第二个参数。但是,由于 JavaScript 是一种动态类型的语言(与静态类型的 Java 不同),您可以混合不同的类型,例如var value = null || "hello" 这将导致 value = "hello"

这允许开发人员将&&|| 用于布尔逻辑以外的其他事情,例如提供默认值,这在Java 中是不可能的,因为静态类型(在Java 中您可以使用三元运算符@ 987654355@,例如String s = input != null ? input : defaultValue,但你可以看到它看起来不像 JavaScript 的 var s = input || defaultValue 那样优雅。

【讨论】:

  • 啊,你是对的。实际上,我在Groovy 中使用了它。这是正确的观点。
  • 我实际上可以再次问这个问题,询问Groovy,但我不太关心Groovy ;)
  • @GrzegorzGajos 嗯,我不太了解 Groovy,但如果它不支持这个原因可能是它与 Java 有关。这样的决定背后可能还有其他一些原因,技术原因以及与政治/风格相关的原因。
  • @GrzegorzGajos 好的,在这种情况下,它可能更多是可读性问题,即if( condition) { doSomething(); }condition && doSomething(); 更容易理解且不易出错,即您不必关心@ 的内容987654363@ 确实并且不必担心意外重新排序语句或仅使用 &
  • @Thomas 不,这并不容易,也不容易出错。它既简单又容易出错,或者更具体地说 - 它是基于意见的。在其他编程语言中,我使用这两种结构;他们的意思对我来说有点不同,但结果是一样的。我两个都用,都喜欢。取决于语言和读者,但在很多情况下 if 的可读性不如 and-ing。
【解决方案2】:

它们不可互换:

isValid && statement(); 是一个表达式不是一个语句。此外,它仅在您的 statement() 方法的类型为 boolean 时才有效。

因此,您只能在 Java 语言语法需要(谓词)表达式的情况下使用它。

意见:如果您在满足上述要求时使用它,那么我确实会发现它“确实降低了可读性”。 (因为它只能在某些情况下使用,而且用你自己的话来说(“做 Java 开发已经快十年了,我从来没有见过”)没有人期待它)

【讨论】:

    【解决方案3】:

    正如上一个答案中解释的那样,`isValid && statement();是一个表达式,需要存储在一些我们不能直接使用的变量中。但是对于语句不是。

    使用表达式占用更多的堆空间。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-16
      • 1970-01-01
      • 2010-12-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多