为什么'condition && statement()'在Java世界中不受欢迎?

Grz*_*jos 10 java boolean readability

我已经做了近十年的Java开发,我从未见过类似[2]的表达式(见下文).我第一次在JavaScript库中看到过这种情况.

1.

if(isValid) {
   statement();
}
Run Code Online (Sandbox Code Playgroud)

2.

isValid && statement();
Run Code Online (Sandbox Code Playgroud)

[1]和[2]的结果是相同的,因为statement()不会对其进行评估if isValid == false.

  • 为什么像[2]这样的语法不受欢迎?我的意思是,在我见过的任何Java项目之前,我从未遇到过这种情况.
  • 方法[2]有什么含义吗?
  • 它被认为是有害的吗?
  • 使用它作为简单if语句的替代方法,我是否会有任何惊喜?
  • 它会降低可读性吗?

编辑:

我在Groovy控制台测试了这个.我想它会使这个问题无效.无论如何,谢谢你的回复.

Tho*_*mas 21

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

除此之外只是 isValid && statement();不被支持的语言-不犯错误,以Java等语言比较像JavaScript语言,他们遵循不同的模式.

可以做类似的事情,boolean b = isValid && statement();但如果你想以b某种方式使用价值,你通常只会这样做.

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

Java的

通常,您可以使用&(和)或|(或)组合两个布尔表达式.因此,true & true将导致true一样true | false,但true & false会导致false

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

现在,如果你有一个调用一些方法,返回一个布尔值,你可能不希望如果不需要他们执行这些方法的表达,例如,当方法本身是相当昂贵的.作为一个例子考虑needsCheckWebsite & isValueOnWebsite( "test" ).isValueOnWebsite( "test" )可能需要一段时间,如果needsCheckWebsite是假的,你不想执行该方法.

为了解决这个问题,你可以使用双字运营商&&||,又名短路运营商.这意味着如果你写needsCheckWebsite && isValueOnWebsite( "test" ),如果needsCheckWebsite是假,那么昂贵的执行isValueOnWebsite( "test" )将不会发生,因为我们已经知道结果不会改变一件事.

因此isValid && statement()意味着statement()只应该执行isValid.

JavaScript的

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

这允许开发者使用&&,并||比布尔逻辑别的东西,比如由于静态类型提供一个默认值,这是不是在Java的可能(在Java中,你可以使用三元运算?为,例如,String s = input != null ? input : defaultValue但你可以看到,看起来不像JavaScript那样优雅var s = input || defaultValue.

  • @Thomas不,它不容易,也不容易出错.这非常简单,容易出错,或者更具体地说 - 它基于意见.在其他编程语言中,我使用两种结构; 他们的意思与我有点不同,但结果是一样的.我使用两者并且喜欢它们.取决于语言和读者,但在许多情况下,如果不是可读性而不是和. (2认同)

rap*_*aëλ 8

它们不可互换:

isValid && statement();是一种表达没有一个说法.此外,它只适用于您的statement()方法类型boolean.

因此,您只能在Java语言语法所需的(谓词)表达式中使用它.

意见:如果你在满足上述要求时使用它,那么我的确会发现它"会降低可读性".(因为它只能在某些情况下使用,再加上你自己的说法("现在几乎进行Java开发,我从未见过")没有人期待它)