Je suis tombé sur ce code source et je voulais m'assurer de bien comprendre pourquoi il est écrit tel quel (ou s'il devrait l'être):
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);
Mes questions sur l'instruction LAST:
Pourquoi utiliser l'opérateur binaire? retentionAll () renverra un booléen indiquant ce qui s'est passé?
Que dit l'opérateur / l'instruction? Si modifié est égal à la valeur de retour, laissez la valeur de modifié seule OU si la valeur de retour est différente, modifiez-la avec cette nouvelle valeur?
5 Réponses :
Cela signifie que si modified
ou retentionAll ()
est vrai, alors modified
doit être vrai. (Ce qui est logique étant donné le nom. retentionAll
ne renvoie vrai que si le Set
a été modifié, et someMysteriousMethod
renvoie probablement vrai ou faux selon l'état du Set
a été changé.)
Le code se décompose en:
true true true false
Regardez le code suivant pour voir les résultats de la | sur les booléens:
System.out.println(true|true); System.out.println(false|true); System.out.println(true|false); System.out.println(false|false);
Sortie:
modified = modified | visibleSites.retainAll(possibleSites);
(Seulement false | false
renverra false
, donc dans le code, modified
et retentionAll
devront retourner false pour modified code> être
faux
)
modified |= visibleSites.retainAll(possibleSites);
La valeur de retour de La méthode retentionAll
dans Set
indique si l'ensemble a été modifié par l'appel.
Retours:
true
si cet ensemble a changé suite à l'appel
Ici, true
indique que l'ensemble a été modifié. L'opérateur composé | =
exécute un "ou" sur les arguments et le réattribue sur le côté gauche. Avec votre cas, cela signifie que si retentionAll
renvoie true
, attribuez true
à modified
, ou laissez < code> modifié inchangé.
Selon le javadoc,
retentionAll
renvoietrue
si cet ensemble a changé à la suite de l'appel
a | = b
est une opération qui affecte le résultat de " a ou b
" à a
.
Par conséquent, dans votre situation, l'idée est d'affecter à modifié
le résultat de l'instruction " visibleSites
a été modifié avant OU
visibleSites < / code> a été modifié par
retentionAll
"
Après ceci:
modifié = someMysteriousMethod ();
puis modifié
peut être vrai ou non. L ' effet de ce qui suit:
modifié | = visibleSites.retainAll (possibleSites);
est de laisser modified
défini sur true s'il était déjà vrai, et de le changer de faux à vrai si une autre condition est vérifiée (je dis effet intentionnellement, je ne décris pas l'opération d'instruction réelle).
La deuxième déclaration pourrait être écrite comme
if (visibleSites.retainAll(possibleSites)) { modified = true; }
avec le même résultat. Dans une certaine mesure, c'est une question de goût. Je trouve que l'original (en utilisant l'opérateur | =
) est plus clair à lire, car c'est une simple expression logique en ligne droite plutôt qu'une instruction de flux de contrôle
Au fait , on ne l'appelle pas un opérateur «au niveau du bit». Java a deux '|' et deux opérateurs '| =' correspondants; entre les entiers, c'est bitwise-or , entre booléens, c'est ou logique .
Avez-vous jeté un œil à la documentation de retenirTout ?