2014-04-22 41 views
5

假设我有两个功能,boolean fA()boolean fB()如何防止短路?

如果我写了另一个函数function(boolean b)我打电话function(fA()||fB())然后fB()可能不会被执行,如果fA()返回true。

我喜欢这个功能,但是在这里我需要两个函数来执行。明显的实现:

boolean temp = fA(); 
function(fB()||temp); 

是丑陋的,并且需要额外的行使它不易读。

有没有一种方法可以用Java或其他优雅的方式强制进行评估,以在没有帮助变量的情况下将其写入一行?

+1

我想这个问题应该叫做“防止短路”。 – 2rs2ts

+4

注意:它可能会更好看,但对于新读者来说,它肯定会隐藏你的意图。 –

+0

@ 2rs2ts是的,那更好。 –

回答

13

您可以使用|相反,它不会做short-circuit evaluation

function(fB() | fA()); 

这保证了即使fBtruefA将被调用。

+0

这是天才。谢谢。现在我只需要等13分钟才能接受你的答案。 –

+2

我不确定这是天才。对于许多程序员来说,这看起来像是一个笔直的错字(他们可能会稍后'修复')。 '|'通常用于处理位串/标志的上下文中。如果不是这种情况,那么使用更长的(多行)版本和评论可能会更好。 – Paul

+2

@Paul'|'是为了在这些情况下使用。应该使用的经典示例.. **是**这种情况。您的评论误导OP,如果程序员认为它是错字,他最好不要编程。 – Maroun

1

您正在尝试编写一些巧妙的代码。这会伤害到长期的可维护性,并可能导致人们试图“修复”你的聪明代码并破坏它。

正确的事情做的就是把它写简单明了你在做什么:

boolean val = false; 
val |= fA(); 
val |= fB(); 
function(val); 

毫无疑问,什么参数val,或者如果fB()被调用时fA()返回false。该代码可能比其他聪明的版本占用更多的行数,但它清晰简明,并且准确地显示了它正在做什么,并打算以不会向其他某些功能提供建议的方式进行操作。