[英]Questions about this bit of Java code, why it is written as it is
我遇到了此源代碼,並想確保我理解為什么按原樣編寫(或應該這樣做):
boolean modified = false;
Set<String> possibleSites = settings.getPossibleSites();
Set<String> visibleSites = settings.getVisibleSites();
modified = someMysteriousMethod();
// Remove sites from visibleSites that are not in possibleSites
modified |= visibleSites.retainAll(possibleSites);
我對LAST陳述的疑問:
為什么要使用按位運算符? keepAll()將返回一個布爾值,說明發生了什么?
運營人/聲明在說什么? 如果修改等於返回值,則僅保留修改的值,或者如果返回值不同,則將修改后的值設置為該新值?
它的意思是說,如果任何modified
或retainAll()
為真,則modified
應該是真實的。 (給定名稱的含義是有意義的retainAll
僅在更改Set
時返回true,而someMysteriousMethod
可能會返回true或false,這取決於Set
的狀態是否更改。)
該代碼分解為:
modified = modified | visibleSites.retainAll(possibleSites);
查看以下代碼,以查看|
的結果。 在布爾值上:
System.out.println(true|true);
System.out.println(false|true);
System.out.println(true|false);
System.out.println(false|false);
輸出:
true
true
true
false
(只有false|false
將返回false
,所以在代碼中,無論是modified
和retainAll
將不得不返回false的modified
是false
)
boolean retainAll(Collection<?> c)
如果the set changed as a result of the call
則返回true
modified |= visibleSites.retainAll(possibleSites);
因此,上述表態意味着,如果modified
是真或retainAll
返回true,那么modified
設置為true,否則的值modified
為假
Set
的retainAll
方法的返回值指示是否通過調用更改了集合。
返回:
如果此設置因調用而更改,則為
true
在此, true
表示該集合已修改。 |=
復合運算符對參數執行“或”並將其分配回左側。 隨着你的情況這意味着,如果retainAll
返回true
,然后分配給true
回modified
,或者保持modified
不變。
根據javadoc,
如果此集合由於調用而發生更改,則
retainAll
重新調整為true
a |= b
是影響“的結果的操作a or b
”到a
。 因此,在您的情況,這個想法是影響到modified
語句的結果“ visibleSites
被修改之前OR
visibleSites
被修改retainAll
”
在這之后:
修改= someMysteriousMethod();
那么modified
是否正確。 具有以下效果 :
修改| = visibleSites.retainAll(possibleSites);
就是如果modified
集已經為true,則將其設為true;如果其他條件成立,則將其從false更改為true(我有意地說是效果 ,我沒有描述實際的指令操作)。
第二句話可以寫成
if (visibleSites.retainAll(possibleSites)) {
modified = true;
}
具有相同的結果。 在某種程度上這是一個品味問題。 我發現原始的(使用|=
運算符)更易於閱讀,因為它是一個簡單的直線邏輯表達式,而不是控制流語句
順便說一句,它不被稱為“按位”運算符。 Java有兩個'|' 和兩個相應的“ | =”運算符; 在整數之間按位或 ,在布爾值之間按 邏輯或 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.