Cum se poate face ca o variabilă booleană să comute între true și false de fiecare dată când o metodă este invocată? (Programare, Java, Boolean)

aperson a intrebat.

Încerc să scriu o metodă care, atunci când este invocată, schimbă o variabilă booleană la true, iar când este invocată din nou, schimbă aceeași variabilă la false, etc.

De exemplu:call method -> boolean = true -> call method -> boolean = false -> call method -> boolean = true

Deci, în principiu,

if (a = false) { a = true; }
if (a = true) { a = false; }

nu sunt sigur cum să realizez acest lucru, deoarece de fiecare dată când apelez metoda, valoarea booleană se schimbă în true și apoi din nou în false.

Comentarii

  • dacă acesta este codul real pe care l-ați încercat, rețineți că a = false este setarea a la fals, nu o testează. folosiți a == false sau mai bine !a pentru a testa dacă un boolean este fals. –  > Por Evan Teran.
  • nu ar trebui să seteze doar a = true, care apoi declanșează al doilea if și setează din nou a = false. aveți nevoie de if else pe a doua linie –  > Por Calul.
9 răspunsuri
ILMTitan
value ^= true;

Aceasta este valoarea xor-equals true, care o va întoarce de fiecare dată, și fără nici o ramificare sau variabile temporare.

Comentarii

  • De obicei, există modalități mai ușor de citit pentru a face acest lucru, cum ar fi răspunsul lui Randy. –  > Por Adriano Varoli Piazza.
  • 17

  • Sunt de acord că este mai puțin ușor de citit. Cu toate acestea, nu cred că este neglijent și nici incorect, cele două criterii sugerate pentru un vot negativ. –  > Por ILMTitan.
  • Păi, depinde. Dacă funcția clasei sau o parte semnificativă a stării sale interne este în mod fundamental comutabilă, atunci da: este indicată o funcție toggleFoo() și este probabil mai ușor de citit. Cu toate acestea, dacă booleanul este o variabilă locală, foo^=true este perfect lizibil și nu aglomerează clasa cu metode irelevante. –  > Por KarlP.
  • nu am mai văzut niciodată acest tip de răsturnare, upvote pentru inspirație! –  > Por zionpi.
  • Îmi place. În timp ce tradiționalul a=!a funcționează destul de bine (și, corectați-mă dacă greșesc, este puțin mai eficient), aceasta este o alternativă frumoasă pentru variabilele cu nume lungi. O modalitate bună de a îmbunătăți lizibilitatea. –  > Por Mașină matematică.
JoePasq

Fără să vă uitați la ea, setați-o la not itself. Nu știu cum să o codific în Java, dar în Objective-C aș spune

booleanVariable = !booleanVariable;

Acest lucru răstoarnă variabila.

Comentarii

  • Este la fel în Java. –  > Por MinecraftShamrock.
Randy Simon

Doar comutați de fiecare dată când este apelat

this.boolValue = !this.boolValue;

bobDevil

Presupunând că codul tău de mai sus este codul real, ai două probleme:

1) declarațiile tale if trebuie să fie „==”, nu „=”. Vrei să faci comparație, nu atribuire.

2) Al doilea if ar trebui să fie un ‘else if’. În caz contrar, atunci când este fals, îl veți seta la true, apoi al doilea if va fi evaluat și îl veți seta din nou la false, așa cum descrieți dvs.

if (a == false) {
  a = true;
} else if (a == true) {
  a = false;
}

Un alt lucru care ar simplifica și mai mult este operatorul ‘!’:

a = !a;

va schimba valoarea lui a.

Comentarii

  • Al doilea if, if (a==true) nici măcar nu este necesar, este suficient doar else, cu excepția cazului în care este vorba de un boolean care ar putea avea o valoare nulă. –  > Por extraneon.
  • Adevărat, dar întotdeauna prefer să fiu explicit în intenția mea, mai ales atunci când răspund la astfel de întrebări. –  > Por bobDevil.
GFP

Eu o fac cu boolean = !boolean;

whirlwin
value = (value) ? false : true;

Operator condiționat (ternar).

EvilInside
var logged_in = false;
logged_in = !logged_in;

Un mic exemplu:

rayd09
private boolean negate(boolean val) {
    return !val;
}

Cred că asta este ceea ce cereți?

bmavus

în java, atunci când setați o valoare la o variabilă, aceasta returnează o nouă valoare. Deci,

private boolean getValue()
{
     return value = !value;
}