2010-10-11 16 views
27

Se si dispone di una variabile booleana:Qual è il modo più conciso per ottenere l'inverso di un valore booleano Java?

boolean myBool = true; 

ho potuto ottenere l'inverso di questo con un if/else clausola:

if (myBool == true) 
myBool = false; 
else 
myBool = true; 

Esiste un modo più conciso per fare questo?

+3

BoltClock ha la risposta ottimale; Mi piacerebbe notare, però, che "if (myBool == true)" è già di per sé molto loquace; "if (myBool)" fa esattamente la stessa cosa. – phisch

+1

@phisch: 'if ((! MyBool! = True || false) && (! (MyBool! = False || true) == false))' – BoltClock

+1

myBool = (myBool)? falsa verità; (Perché non riesco a resistere all'opportunità di usare la forma ternaria anche se questo non è - il più conciso) – KevinDTimm

risposta

83

Basta assegnare utilizzando l'operatore logico NOT ! come si tende a fare nella tua condizione dichiarazioni (if, for, while ...). Si sta lavorando con un valore booleano già, quindi sarà capovolgere true a false (e viceversa):

myBool = !myBool; 
+2

Questo è davvero più conciso. Ma vorrei sottolineare che la risposta di 'bvdb' riguarda la corretta gestione di' Boolean' – buzzsawddog

36

Un modo ancora più fresco (che è più conciso rispetto myBool = !myBool per nomi di variabili più lunghi di 4 caratteri se si desidera impostare la variabile):

myBool ^= true; 

E tra l'altro, non utilizzare if (something == true), è più semplice se lo farete if (something) (lo stesso con il confronto con falsa, utilizzare l'operatore di negazione).

+11

Heck yeah XOR! +1 – BoltClock

+8

Queste sono le piccole cose che rendono le infinite ore di programmazione più divertenti xD ​​ – fortran

+3

Speravo di trovare una sintassi sintetica che i miei colleghi capiranno intuitivamente senza dover fare una domanda su StackOverflow per capire cosa sto facendo. – faq

-3
myBool = myBool ? false : true; 
+4

copiato dai commenti alla domanda? – Jorn

+0

Non c'è differenza tra entrambi? – Jinjavacoder

1

Il modo più conciso è quello di non invertire il valore booleano e utilizzare! MyBool più avanti nel codice quando si desidera verificare la condizione opposta.

+3

hai ragione, ma a volte devi farlo se si tratta di una bandiera che effettivamente cambia – fortran

11

Per un boolean è piuttosto facile, uno Boolean è un po 'più impegnativo.

  • Un boolean ha solo 2 possibili stati: true e false.
  • A Boolean un altro ha 3: Boolean.TRUE, Boolean.FALSE o null.

Supponendo che si sta solo a che fare con un boolean (che è un tipo primitivo), allora la cosa più semplice da fare è:

boolean someValue = true; // or false 
boolean negative = !someValue; 

Tuttavia, se si vuole invertire una Boolean (che è un oggetto), è necessario prestare attenzione al valore null oppure si può finire con uno NullPointerException.

Boolean someValue = null; 
Boolean negativeObj = !someValue.booleanValue(); --> throws NullPointerException. 

Supponendo che questo valore non è mai nullo, e che la vostra azienda o organizzazione non ha code-regole contro automatica (ONU) di pugilato. In realtà puoi solo scriverlo in una riga.

Boolean someValue = Boolean.TRUE; // or Boolean.FALSE 
Boolean negativeObj = !someValue; 

Tuttavia, se si vuole prendere cura dei valori null pure. Poi ci sono diverse interpretazioni.

boolean negative = !Boolean.TRUE.equals(someValue); //--> this assumes that the inverse of NULL should be TRUE. 

// if you want to convert it back to a Boolean object, then add the following. 
Boolean negativeObj = Boolean.valueOf(negative); 

D'altra parte, se si vuole null rimanere null dopo l'inversione, allora si può prendere in considerazione utilizzando la apache commons classe BooleanUtils (see javadoc)

Boolean someValue = null; // or Boolean.TRUE or Boolean.FALSE; 
Boolean negativeObj = BooleanUtils.negate(someValue); 

Alcuni preferiscono solo scrivere tutto fuori, per evitare di avere la dipendenza Apache.

Boolean someValue = null; // or Boolean.TRUE or Boolean.FALSE; 
boolean negative = (someValue == null)? null : !someValue.booleanValue(); 
Boolean negativeObj = Boolean.valueOf(negative); 
+1

Grazie per questa risposta. Sento che la risposta accettata è davvero più concisa. MA Sento che la tua risposta è più completa! Grazie per la copertura 'boolean' AND' Boolean' – buzzsawddog

Problemi correlati