boolean allValid = true;
for (FormEditText field: allFields) {
allValid = field.testValidity() && allValid;
}
我想allValid
是true
只有當每個field.testValidity
是真的,但怎麼叫這種說法或者它是如何工作的?請解釋這個Java布爾邏輯陳述
boolean allValid = true;
for (FormEditText field: allFields) {
allValid = field.testValidity() && allValid;
}
我想allValid
是true
只有當每個field.testValidity
是真的,但怎麼叫這種說法或者它是如何工作的?請解釋這個Java布爾邏輯陳述
它將轉向false
如果對於任何field.testValidity
是false
因爲false AND x = false
所以它必須是true
它們全部+初始值(它是true
在此代碼)的是true
在循環之後
你的假設是正確的。如果右邊的任一表達式評估爲false
,則AND
(&&
)評估爲false
,並且該結果用於下一個迭代中。因此,任何false
將導致false
結果。
你可能會說,只要遇到false
(假設testValidity()
沒有副作用),你就可以跳出循環,但這可能實際上影響了它的功能,但犧牲了某些(可能忽略不計的)性能提升。在大多數情況下,我希望清晰度高於效率
這是Java中常見的成語嗎?它看起來非常浪費。 –
我不這麼認爲。我不確定它是否浪費*因爲你必須遍歷一個集合來確定任何錯誤的元素。也許我會對它發表評論,但我不會過分擔心遇到它。你可能會說,一旦遇到錯誤,你就可以跳出循環,但這可能實際上影響了這個功能,而犧牲了一些(可能忽略不計的)性能提升。在大多數情況下,我希望清晰度高於效率 –
嗯,不。一旦到達第一個「False」元素,就可以中止「for」循環。也就是說,除非你依賴於'.testValidity()'的一些副作用,在這種情況下,情況會更糟...... –
allValid
只有在所有字段都有效的情況下才會是true
。
&&
行爲是這樣的,如果參數之一是false
,答案是false.
如果你有3個字段,那麼正在發生的事情是:
allValid = field3Valid && (field2Valid && field1Valid);
因此,如果任何的字段變得無效,那麼allValid
將是false
。
如果2場是無效的,那麼:
allValid = true && (false && true); // ---> true && (false) ----> false
這是它的工作原理是低效的,因爲@Bathsheba的回答指出。
在循環中,只要field.testValidity()返回true,allValid就會保持爲true。 只要field.testValidity()返回false,allValid將變爲false並保持false。
這是因爲假& & true = false。
當且僅當field.testValidity()
的所有結果爲真時,將變量設置爲真是一種相當神祕且浪費的方式。
我更喜歡類似以下的東西,因爲它更高效;除非testValidity()需要在出於某種原因,集合中的每一項被稱爲(在這種情況下要重命名的功能確實應該):
boolean allValid = true;
for (FormEditText field: allFields) {
if (!field.testValidity()){
allValid = false;
break;
}
}
從代碼,它看起來像這樣的代碼是用來檢查如果allFields
變量中的所有字段都通過驗證。
在這種情況下,我們可以修改代碼,如果其中一個字段無效,那麼我們可以在break
這個循環中使用。
不,你不能,除非你知道testValidity()是一個純粹的函數,它不會改變狀態。但是由於條件寫入'testValid()&& allValid',看起來由於某種原因,testValid()必須針對所有數組元素運行。 – Ingo
for (FormEditText field: allFields)
意味着foreach field
在allFields
檢查field.testValidity() AND allValid
。所以如果在任何支票field.testValidity()
返回false
那麼allValid
將是false
。
正如該字段的名稱所暗示的,allValid將爲true,當且僅當所有表單字段都是有效的,否則當它退出循環時將爲假。如果至少有一個表單域無效,那麼這將是錯誤的。
我認爲這是智能編寫的代碼,對於那些不太適應布爾算術的人來說會顯得神祕。我也是這樣寫的,如果我不得不,但有一些意見解釋意圖。
Yuck。你在哪裏看到這個? –
循環之後,您知道所有字段是否具有testValidity()true。我不知道是否有這樣的代碼模式的名稱。 –
你是什麼意思,「這是怎麼稱呼」?你在問一個名字嗎?你問是否會執行? – user2357112