1
votes

Questions sur ce morceau de code Java, pourquoi il est écrit tel quel

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:

  1. Pourquoi utiliser l'opérateur binaire? retentionAll () renverra un booléen indiquant ce qui s'est passé?

  2. 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?


1 commentaires

Avez-vous jeté un œil à la documentation de retenirTout ?


5 Réponses :


1
votes

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)


0 commentaires

1
votes
modified |= visibleSites.retainAll(possibleSites);

0 commentaires

0
votes

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é.


0 commentaires

0
votes

Selon le javadoc,

retentionAll renvoie true 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 "


0 commentaires

0
votes

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 .


0 commentaires