2014-04-22 42 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。該代碼可能比其他聰明的版本佔用更多的行數,但它清晰簡明,並且準確地顯示了它正在做什麼,並打算以不會向其他某些功能提供建議的方式進行操作。