我一直在阅读 Robert Nystrom 的书 Crafting Interpreters 并发现了以下代码:
if (!scopes.isEmpty() && scopes.peek().get(expr.name.lexeme) == Boolean.FALSE) { // <- Focus here
// some code here
}
在我们声明变量的其他地方,本书使用了更常用的语法
boolean a = false
表示法。 Stack Overflow 有很多答案解释什么是 Boolean.FALSE
,但没有说明何时应该使用它。
在相等运算符的上下文中编写 Boolean.FALSE (或 Boolean.TRUE)是一种常见/良好的做法吗?如果是,那为什么?
或者,这是个人喜好和代码可读性的问题吗?
布尔包装值 TRUE 和 FALSE 被缓存,因此即使 == 比较引用,这些引用始终相同,并且 == 的工作方式就好像基于值一样。
这里没有什么问题。也许作者是想避免不必要的拆箱。
一般来说,使用编写 Boolean.FALSE (或 Boolean.TRUE)是一种常见/良好的做法吗? 在相等运算符的背景下?如果是,那为什么?
Boolean.FALSE
不是
常见/良好做法,但在某些特定情况下
Boolean.FALSE
可能很有用。其中一种情况就是您问题中的代码。基本上,该代码的含义与
if (!scopes.isEmpty() && scopes.peek().get(expr.name.lexeme) != null && !scopes.peek().get(expr.name.lexeme))
相同,但无需调用
peek().get(...)
两次。如果你想要完全相同的结果,但不使用
Boolean.FALSE
,你必须这样写:
Boolean tmp;
if (!scopes.isEmpty() && (tmp = scopes.peek().get(expr.name.lexeme)) != null && !tmp) {
...
}
因此,使用 xxx == Boolean.FALSE
在某些特定情况下可以发挥作用。