簡體   English   中英

有關這部分Java代碼的問題,為什么要按原樣編寫

[英]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陳述的疑問:

  1. 為什么要使用按位運算符? keepAll()將返回一個布爾值,說明發生了什么?

  2. 運營人/聲明在說什么? 如果修改等於返回值,則僅保留修改的值,或者如果返回值不同,則將修改后的值設置為該新值?

它的意思是說,如果任何modifiedretainAll()為真,則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 ,所以在代碼中,無論是modifiedretainAll將不得不返回false的modifiedfalse

boolean retainAll(Collection<?> c)

如果the set changed as a result of the call則返回true

modified |= visibleSites.retainAll(possibleSites);

因此,上述表態意味着,如果modifiedretainAll返回true,那么modified設置為true,否則的值modified

SetretainAll方法的返回值指示是否通過調用更改了集合。

返回:

如果此設置因調用而更改,則為true

在此, true表示該集合已修改。 |=復合運算符對參數執行“或”並將其分配回左側。 隨着你的情況這意味着,如果retainAll返回true ,然后分配給truemodified ,或者保持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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM