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
.
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
.
它们不可互换:
isValid && statement();
是一种表达和没有一个说法.此外,它只适用于您的statement()
方法类型boolean
.
因此,您只能在Java语言语法所需的(谓词)表达式中使用它.
意见:如果你在满足上述要求时使用它,那么我的确会发现它"会降低可读性".(因为它只能在某些情况下使用,再加上你自己的说法("现在几乎进行Java开发,我从未见过")没有人期待它)