带有逻辑的返回语句

4

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

变量access是一个整数。

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

2
不,那些是常规的逻辑运算符。这与“12+34”基本上没有区别。 - SLaks
3
它返回一个布尔值,表示该逻辑表达式是否为真。 - Louis Wasserman
如果不确定,请将表达式括在括号中。它只是 return (some expression),不比 return (1+2) 复杂。 - 9000
4
相反,我强烈建议这种写法更易读,比引入另一个无用的局部变量要好。 - Marko Topolnik
将代码分解为更多表达式是否使代码更易读是一个古老的讨论。我不想说哪种方式是对或错,尽管我的观点更接近@MarkoTopolnik的观点。 - Geeky Guy
显示剩余3条评论
3个回答

8

让我们来分解一下,使用括号明确逻辑分组:

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

所以,该方法返回一个布尔值,是执行比较的结果。在表达式的值返回之前,整个表达式都将被评估。
假设access等于IACL.RS_NOACCESSdocumentVersion等于1。那么该语句简化为:
return ((IACL.RS_NOACCESS != IACL.RS_NOACCESS) && (1 >= 0));

并且这将评估为:

return ((false) && (true));

并且它的值为:
return false;

重要提示:在大多数语言中,逻辑运算符(如&&和||)在大多数场景下都是“短路”的。在Java中也是如此。这意味着评估从左到右进行。如果没有必要评估表达式的第二部分,则不会进行评估。
在上面的情况下,由于表达式的第一部分评估为false,第二部分的评估结果并不重要——根据AND真值表,整个表达式总是将评估为false。实际上,您可以有一个在右侧生成运行时错误的表达式——这并不重要。对于这些值,右侧永远不会被运行。

4
需要注意的一点是,如果第一个语句为假,操作将会短路并返回假值,因为 false && a 总是假的。所以 false && a() 不会调用 a()。如果想无论如何都要调用 a(),可以使用 false & a() - Ryan Amos
1
好的,@Ryan。已添加讨论。 - Michael Petrotta
@RyanAmos,你能举个例子说明在什么情况下你想强制调用 a() 吗? - Trevor
如果a()改变了状态,你需要执行两个动作,但如果任何一个动作失败,你想返回false。我记得过去必须处理这个问题,但我现在脑海中想不出任何好的例子。 - Ryan Amos
@Trevor 今天用了一个 if(finder.isDirectoryExSTraCS(finder.chooser.getCurrentDirectory())|| JOptionPane.showConfirmDialog(finder, "It doesn't appear that this directory is an ExSTraCS directory. Proceed anyways?", "Wrong Directory", JOptionPane.OK_CANCEL_OPTION) == JOptionPane.OK_OPTION) - Ryan Amos

5

return右侧的整个表达式将被求值为布尔值,这就是返回的结果。

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

等价于:

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

2

这相当于:

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

这仅仅是为了节省空间,因此不必存储access != IACL.RS_NOACCESS && documentVersion >= 0的结果,从而消除了变量。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接