Java 带有内置逻辑的Return语句

Java 带有内置逻辑的Return语句,java,boolean-logic,Java,Boolean Logic,我知道这可能是一个非常简单的问题,但我今天在一个项目的一些代码中遇到了这个问题。return语句是如何工作的?这是什么手术?它类似于三级操作符吗 变量access是一个int return access != IACL.RS_NOACCESS && documentVersion >= 0; return右侧的整个表达式计算为一个布尔值,即返回的值 return access != IACL.RS_NOACCESS && documentVersion &

我知道这可能是一个非常简单的问题,但我今天在一个项目的一些代码中遇到了这个问题。return语句是如何工作的?这是什么手术?它类似于三级操作符吗

变量access是一个int

return access != IACL.RS_NOACCESS && documentVersion >= 0;

return
右侧的整个表达式计算为一个布尔值,即返回的值

return access != IACL.RS_NOACCESS && documentVersion >= 0;
相当于:

boolean result = (access != IACL.RS_NOACCESS);
result = result && (documentVersion >= 0);
return result;
boolean valid = access != IACL.RS_NOACCESS && documentVersion >= 0;
return valid;
这相当于:

boolean result = (access != IACL.RS_NOACCESS);
result = result && (documentVersion >= 0);
return result;
boolean valid = access != IACL.RS_NOACCESS && documentVersion >= 0;
return valid;

它只是消除了变量,因为不需要存储
access!=IACL.RS\u无访问和文档版本>=0
。基本上,这只是为了节省空间。

让我们将其分解,使用括号明确逻辑分组:

return ((access != IACL.RS_NOACCESS) && (documentVersion >= 0));
因此,该方法返回一个布尔值,即执行比较的结果。在返回表达式的值之前,将对整个表达式求值

return access != IACL.RS_NOACCESS && documentVersion >= 0;
让我们假设
access
等于
IACL.RS\u NOACCESS
documentVersion
等于
1
。然后,该语句简化为:

return ((IACL.RS_NOACCESS != IACL.RS_NOACCESS) && (1 >= 0));
评估结果如下:

return ((false) && (true));
return false;
评估结果如下:

return ((false) && (true));
return false;
Ryan在一篇评论中指出了一个重要的注意事项:像&&和| |这样的逻辑运算符在大多数语言和场景中都是“短路”的。它们是用Java编写的。这意味着评估从左到右进行。如果对表达式的第二部分求值没有意义,则不会对其求值


在上面的例子中,由于表达式的第一部分计算结果为false,所以表达式的第二部分计算结果是什么并不重要——给定AND真值表,完整表达式的计算结果将始终为false。事实上,您可以有一个表达式,它在右侧生成运行时错误——这无关紧要。有了这些值,就永远不会运行右侧。

No;这些是常规逻辑运算符。这与
1*2+3*4
没有根本区别,它返回一个
boolean
,说明该逻辑表达式是否为真。如果有疑问,请将表达式括在括号中。它只是
return(一些表达式)
,并不比
return(1+2)
-看看这个例子;
return
之后的内容将被计算并返回。相反,我强烈建议这比引入另一个无用的局部变量更具可读性。需要注意的是,如果第一个语句为false,则操作将短路并返回false,因为
false&&a
总是false。因此
false&&a()
将不会调用
a()
。如果您想强制调用
a()
而不管如何,请使用
false&a()
Good call,@Ryan。添加了一个讨论。@RyanAmos您能举一个例子说明如果
a()
改变了状态,您想强制调用
a()
。您需要执行这两个操作,但如果其中一个操作失败,您希望返回false。我记得过去必须处理这个问题,但我想不出任何好的例子。@Trevor今天使用了一个
if(finder.isDirectoryExSTraCS(finder.chooser.getCurrentDirectory())| | JOptionPane.showConfirmDialog(finder),“这个目录似乎不是ExSTraCS目录,是否继续?”,“错误目录”,JOptionPane.OK\u CANCEL\u OPTION)==JOptionPane.OK\u OPTION)