为什么 'condition && statement()' 在 Java 世界不流行?
Why 'condition && statement()' is not popular in Java world?
在 Java 脚本世界中(尤其是在 React 应用程序中)我见过像 [2] 这样的表达式。然而,在 Java 这不是很流行。
1.
if(isValid) {
statement();
}
isValid && statement();
[1] 和 [2] 的结果相同,因为 statement()
不会被评估 if isValid == false
。
- 为什么像 [2] 这样的语法不流行?我的意思是,我以前在我见过的任何 Java 项目中从未遇到过这种情况。
- 方法 [2] 有任何影响吗?
- 它被认为是有害的吗?
- 使用它作为简单
if
语句的替代方案时,我可能会感到惊讶吗?
- 它会降低可读性吗?
编辑:
我在 Groovy
控制台中对此进行了测试。我想这使这个问题非常无效。无论如何感谢您的回复。
if( isValid && statement() )
仅在 statement()
return 为 boolean
时有效,否则条件将无法编译。这样做 可能 不被认为是好的设计(取决于 statement
实际做了什么)并且可能会降低可读性或您使用 return 值 [=11] 的能力=].
除此之外 just isValid && statement();
不受语言支持 - 不要错误地将 Java 之类的语言与其他语言进行比较JavaScript 之类的语言,它们遵循不同的范例。
你 可以 做类似 boolean b = isValid && statement();
的事情,但通常只有当你想以某种方式使用 b
的值时才会这样做。
编辑: 根据KRyan的要求,我还将添加一段关于a && b
的含义及其在[=中的用途87=] 以及 JavaScript(虽然我不是这里的专家)。
Java
通常,您可以使用 &
(和)或 |
(或)组合两个布尔表达式。因此 true & true
将导致 true
和 true | false
一样,但 true & false
将导致 false
等
单字符运算符的问题在于,即使您已经知道结果,每个 参数都会被计算。例如,当您看到 false & ...
时,您已经知道在查看第一个参数时结果是 false
,任何其他参数都不会产生影响。
现在,如果您有一个表达式调用某些方法,其中 return 一个布尔值,您可能不想执行那些不需要的方法,例如当方法本身非常昂贵时。例如考虑 needsCheckWebsite & isValueOnWebsite( "test" )
。 isValueOnWebsite( "test" )
可能需要一段时间,如果 needsCheckWebsite
为假,您不想执行该方法。
要解决这个问题,您可以使用双字符运算符 &&
和 ||
,也就是短路运算符。这意味着如果你写 needsCheckWebsite && isValueOnWebsite( "test" )
并且如果 needsCheckWebsite
为假,那么 isValueOnWebsite( "test" )
的昂贵执行将不会发生,因为我们已经知道结果不会改变任何事情。
因此 isValid && statement()
意味着 statement()
应该只在 isValid
.
时执行
Java脚本
AFAIK 在 JavaScript 中,短路运算符以类似的方式工作,因为它评估第一个参数,如果结果仍然未知,则评估第二个参数并 returned。但是,由于 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 语言语法需要(谓词)表达式的地方使用它。
意见:如果满足以上要求你就用它,那我确实觉得"Does decrease readability"。 (因为它只能在某些情况下使用,加上你自己的话("doing Java development for an almost decade now and I've never seen")没人期望它)
如上一个答案中所述,`isValid && statement();是一个表达式,需要存储在一些我们不能直接使用的变量中。但是对于语句不是。
使用表达式又占用了一个堆space。
在 Java 脚本世界中(尤其是在 React 应用程序中)我见过像 [2] 这样的表达式。然而,在 Java 这不是很流行。
1.
if(isValid) {
statement();
}
isValid && statement();
[1] 和 [2] 的结果相同,因为 statement()
不会被评估 if isValid == false
。
- 为什么像 [2] 这样的语法不流行?我的意思是,我以前在我见过的任何 Java 项目中从未遇到过这种情况。
- 方法 [2] 有任何影响吗?
- 它被认为是有害的吗?
- 使用它作为简单
if
语句的替代方案时,我可能会感到惊讶吗? - 它会降低可读性吗?
编辑:
我在 Groovy
控制台中对此进行了测试。我想这使这个问题非常无效。无论如何感谢您的回复。
if( isValid && statement() )
仅在 statement()
return 为 boolean
时有效,否则条件将无法编译。这样做 可能 不被认为是好的设计(取决于 statement
实际做了什么)并且可能会降低可读性或您使用 return 值 [=11] 的能力=].
除此之外 just isValid && statement();
不受语言支持 - 不要错误地将 Java 之类的语言与其他语言进行比较JavaScript 之类的语言,它们遵循不同的范例。
你 可以 做类似 boolean b = isValid && statement();
的事情,但通常只有当你想以某种方式使用 b
的值时才会这样做。
编辑: 根据KRyan的要求,我还将添加一段关于a && b
的含义及其在[=中的用途87=] 以及 JavaScript(虽然我不是这里的专家)。
Java
通常,您可以使用 &
(和)或 |
(或)组合两个布尔表达式。因此 true & true
将导致 true
和 true | false
一样,但 true & false
将导致 false
等
单字符运算符的问题在于,即使您已经知道结果,每个 参数都会被计算。例如,当您看到 false & ...
时,您已经知道在查看第一个参数时结果是 false
,任何其他参数都不会产生影响。
现在,如果您有一个表达式调用某些方法,其中 return 一个布尔值,您可能不想执行那些不需要的方法,例如当方法本身非常昂贵时。例如考虑 needsCheckWebsite & isValueOnWebsite( "test" )
。 isValueOnWebsite( "test" )
可能需要一段时间,如果 needsCheckWebsite
为假,您不想执行该方法。
要解决这个问题,您可以使用双字符运算符 &&
和 ||
,也就是短路运算符。这意味着如果你写 needsCheckWebsite && isValueOnWebsite( "test" )
并且如果 needsCheckWebsite
为假,那么 isValueOnWebsite( "test" )
的昂贵执行将不会发生,因为我们已经知道结果不会改变任何事情。
因此 isValid && statement()
意味着 statement()
应该只在 isValid
.
Java脚本
AFAIK 在 JavaScript 中,短路运算符以类似的方式工作,因为它评估第一个参数,如果结果仍然未知,则评估第二个参数并 returned。但是,由于 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 语言语法需要(谓词)表达式的地方使用它。
意见:如果满足以上要求你就用它,那我确实觉得"Does decrease readability"。 (因为它只能在某些情况下使用,加上你自己的话("doing Java development for an almost decade now and I've never seen")没人期望它)
如上一个答案中所述,`isValid && statement();是一个表达式,需要存储在一些我们不能直接使用的变量中。但是对于语句不是。
使用表达式又占用了一个堆space。