2013-07-05 34 views
1
boolean allValid = true; 
for (FormEditText field: allFields) { 
    allValid = field.testValidity() && allValid; 
} 

我想allValidtrue只有當每個field.testValidity是真的,但怎麼叫這種說法或者它是如何工作的?請解釋這個Java布爾邏輯陳述

+2

Yuck。你在哪裏看到這個? –

+0

循環之後,您知道所有字段是否具有testValidity()true。我不知道是否有這樣的代碼模式的名稱。 –

+3

你是什麼意思,「這是怎麼稱呼」?你在問一個名字嗎?你問是否會執行? – user2357112

回答

0

它將轉向false如果對於任何field.testValidityfalse因爲false AND x = false

所以它必須是true它們全部+初始值(它是true在此代碼)的是true在循環之後

1

你的假設是正確的。如果右邊的任一表達式評估爲false,則AND&&)評估爲false,並且該結果用於下一個迭代中。因此,任何false將導致false結果。

你可能會說,只要遇到false(假設testValidity()沒有副作用),你就可以跳出循環,但這可能實際上影響了它的功能,但犧牲了某些(可能忽略不計的)性能提升。在大多數情況下,我希望清晰度高於效率

+1

這是Java中常見的成語嗎?它看起來非常浪費。 –

+1

我不這麼認爲。我不確定它是否浪費*因爲你必須遍歷一個集合來確定任何錯誤的元素。也許我會對它發表評論,但我不會過分擔心遇到它。你可能會說,一旦遇到錯誤,你就可以跳出循環,但這可能實際上影響了這個功能,而犧牲了一些(可能忽略不計的)性能提升。在大多數情況下,我希望清晰度高於效率 –

+1

嗯,不。一旦到達第一個「False」元素,就可以中止「for」循環。也就是說,除非你依賴於'.testValidity()'的一些副作用,在這種情況下,情況會更糟...... –

0

allValid只有在所有字段都有效的情況下才會是true

&&行爲是這樣的,如果參數之一是false,答案是false.

如果你有3個字段,那麼正在發生的事情是:

allValid = field3Valid && (field2Valid && field1Valid); 

因此,如果任何的字段變得無效,那麼allValid將是false

如果2場是無效的,那麼:

allValid = true && (false && true); // ---> true && (false) ----> false 

這是它的工作原理是低效的,因爲@Bathsheba的回答指出。

0

在循環中,只要field.testValidity()返回true,allValid就會保持爲true。 只要field.testValidity()返回false,allValid將變爲false並保持false。

這是因爲假& & true = false。

5

當且僅當field.testValidity()的所有結果爲真時,將變量設置爲真是一種相當神祕且浪費的方式。

我更喜歡類似以下的東西,因爲它更高效;除非testValidity()需要在出於某種原因,集合中的每一項被稱爲(在這種情況下要重命名的功能確實應該):

boolean allValid = true; 
for (FormEditText field: allFields) { 
    if (!field.testValidity()){ 
     allValid = false; 
     break; 
    } 
} 
+2

這看起來好多了。但是,這迫使我吹噓我們在Python中有多好:'all(field.testValidity()for allFields)':) –

+3

注意這是一個完全不同的語義。如果testValid()改變某些狀態會怎麼樣? – Ingo

+0

我相信這是用booelan邏輯書寫得很好。對於那些不習慣使用boolena邏輯的人來說,它可能看起來很神祕。 – Drona

0

從代碼,它看起來像這樣的代碼是用來檢查如果allFields變量中的所有字段都通過驗證。

在這種情況下,我們可以修改代碼,如果其中一個字段無效,那麼我們可以在break這個循環中使用。

+0

不,你不能,除非你知道testValidity()是一個純粹的函數,它不會改變狀態。但是由於條件寫入'testValid()&& allValid',看起來由於某種原因,testValid()必須針對所有數組元素運行。 – Ingo

0

for (FormEditText field: allFields)意味着foreach fieldallFields檢查field.testValidity() AND allValid。所以如果在任何支票field.testValidity()返回false那麼allValid將是false

0

正如該字段的名稱所暗示的,allValid將爲true,當且僅當所有表單字段都是有效的,否則當它退出循環時將爲假。如果至少有一個表單域無效,那麼這將是錯誤的。

我認爲這是智能編寫的代碼,對於那些不太適應布爾算術的人來說會顯得神祕。我也是這樣寫的,如果我不得不,但有一些意見解釋意圖。