Il modo più pulito per attivare o disattivare una variabile booleana in Java?


211

C'è un modo migliore per negare un booleano in Java che un semplice if-else?

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

oh bello, stavo per fare la stessa domanda, anche se la mia domanda sarebbe stata specifica per javascript / as3, o ECMAScript in generale suppongo ... che sarà facilmente coperto da questa domanda.
Matt Lohkamp,

E se non ci fosse! operatore ??
onmyway133,

Risposte:


537
theBoolean = !theBoolean;

16
Questo è ... molto ovvio ... oops! Non so perché non ci abbia pensato. Grazie.
Kevin Griffin,

! Boolean sembra una scelta naturale, forse in futuro.
Matt Lohkamp,

21
@ypnos: !!bool == !(!(bool)) == bool.
Christoffer Hammarström,

12
@ ChristofferHammarström Secondo questa logica, allora non dovrebbe --integer == - (- (intero)) == intero?
user515655

1
@ user515655 - La lingua definisce un --operatore (in realtà, due di loro, insieme a due ++operatori), ma non definisce un !!operatore. Se vuoi -(-(integer))puoi usare uno spazio bianco tra i due -personaggi. Ma !!analizza come due !operatori indipendentemente dallo spazio bianco.
Ted Hopp,

164
theBoolean ^= true;

Meno sequenze di tasti se la variabile è più lunga di quattro lettere

Modifica : il codice tende a restituire risultati utili se utilizzato come termine di ricerca di Google. Il codice sopra non lo fa. Per chi ne ha bisogno, è XOR bit a bit come descritto qui .


14
ed è conforme a DRY :)
Tetha,

6
La brevità è l'anima dell'ingegno.
Paul Brinkley,

7
ora riesco a dare un nome a drop-drop (sintassi-drop?) XOR per apparire accattivante di fronte ai miei amici programmatori. La tua risposta dovrebbe essere unita a quella scelta, insieme sono pura perfezione.
Matt Lohkamp,

6
@ScottStanchfield Queste persone dovrebbero impararlo. Non è affatto difficile, non è un hack e non sapere che spesso porta a un codice scadente come ad esempio quello di questa domanda. Questa è una vera esplosione: cinque linee usando le convenzioni standard!
maaartinus,

4
Questa operazione è anche più veloce del 12% rispetto ad altre versioni come theBoolean = !theBoolean;otheBoolean = theBoolean ? false : true;
Blaine Kasten,

32

Ce ne sono diversi

Il modo "ovvio" (per la maggior parte delle persone)

theBoolean = !theBoolean;

Il modo "più breve" (il più delle volte)

theBoolean ^= true;

Il modo "più visivo" (più incerto)

theBoolean = theBoolean ? false : true;

Extra: attiva e disattiva in una chiamata di metodo

theMethod( theBoolean ^= true );

Poiché l'operatore di assegnazione restituisce sempre ciò che è stato assegnato, questo commuta il valore tramite l'operatore bit a bit, quindi restituisce il valore appena assegnato da utilizzare nella chiamata del metodo.


Avvolgi l'implementazione in una funzione / metodo chiamato toggle e quindi non c'è quasi modo di confonderlo.
Lambage,

@Reiner: CSicuramente, ma in Javaesso non è permesso mescolare booleano e intero (anche cose come while(1)Java non sono possibili).
Levite,

@Lambage: vero, ma il lato negativo non è possibile attivare o disattivare un booleano semplicemente passandolo, poiché non è possibile passare le primitive per riferimento in Java. Dovresti riassegnare il risultato del metodo alla tua variabile, o altrimenti creare una classe wrapper per il valore booleano.
Levite,

Il "modo ovvio" di cui sopra viene contrassegnato da SONAR con - Gli incarichi interni dovrebbero essere evitati.
Orby,

2

Se usi valori NULL booleani e li consideri falsi, prova questo:

static public boolean toggle(Boolean aBoolean) {
    if (aBoolean == null) return true;
    else return !aBoolean;
}

Se non stai consegnando valori NULL booleani, prova questo:

static public boolean toggle(boolean aBoolean) {
   return !aBoolean;
}

Questi sono i più puliti perché mostrano l'intento nella firma del metodo, sono più facili da leggere rispetto al ! operatore e può essere facilmente eseguito il debug.

uso

boolean bTrue = true
boolean bFalse = false
boolean bNull = null

toggle(bTrue) // == false
toggle(bFalse) // == true
toggle(bNull) // == true

Naturalmente, se si utilizza Groovy o una lingua che consente metodi di estensione, è possibile registrare un'estensione e semplicemente:

Boolean b = false
b = b.toggle() // == true

Buon approccio, ma non del tutto inequivocabile (imho). Per qualcuno che usa / legge solo "toggle (..)" potrebbe pensare, chiamare il metodo (senza assegnarlo di nuovo alla variabile) potrebbe già attivare / disattivare la variabile sottostante. È ovvio per noi in questo momento vedere il codice, ma nella vita reale potrebbe essere abbastanza difficile eseguire il debug. Un nome di metodo migliore potrebbe essere "opposto" o possibilmente "negazione", per renderlo un po 'più ovvio; oppure usa il primo approccio con un oggetto Booleane attivalo realmente all'interno del metodo (ma ancora in qualche modo ambiguo).
Levita,

2

Questa risposta è venuta alla ricerca di "java invert boolean function". L'esempio seguente eviterà che alcuni strumenti di analisi statica falliscano le build a causa della logica di branching. Questo è utile se devi invertire un valore booleano e non hai sviluppato test unitari completi;)

Boolean.valueOf(aBool).equals(false)

o in alternativa:

Boolean.FALSE.equals(aBool)

o

Boolean.FALSE::equals

1
Mi piace il fatto che tu possa passare Boolean.FALSE::equalsa una funzione di mappatura invece di scrivere un po 'di lambda
Patrick Parker,

0

Se non stai facendo nulla di particolarmente professionale, puoi sempre usare una classe Util. Ad esempio, una classe util da un progetto per una classe.

public class Util {


public Util() {}
public boolean flip(boolean bool) { return !bool; }
public void sop(String str) { System.out.println(str); }

}

quindi basta creare un oggetto Util Util u = new Util(); e avere qualcosa per il ritornoSystem.out.println( u.flip(bool) );

Se finirai per usare sempre la stessa cosa, usa un metodo e soprattutto se si tratta di progetti, crea una classe Util. Non so quale sia lo standard del settore, tuttavia. (I programmatori esperti si sentono liberi di correggermi)



-4

Prima:

boolean result = isresult();
if (result) {
    result = false;
} else {
    result = true;
}

Dopo:

boolean result = isresult();
result ^= true;

Chi ha mai votato? Puoi per favore spiegare anche la ragione?
Nikhil Kumar,

11
Due motivi principali per cui riesco a pensare al motivo per cui qualcuno potrebbe averti sottoposto a un downgrade: 1) Negromanzia del thread ( dai! La domanda è stata posta 7 (!) Anni fa! ) E la tua risposta non porta nulla di nuovo sul tavolo; 2) L'elettore si aspettava qualcosa di "più pulito" ( leggi: più breve ) - La risposta di AaronMaenpaa ne è un ottimo esempio.
Priidu Neemre,

5
@Elltz: Al contrario, l'ho effettivamente votato, dal momento che la risposta era tecnicamente corretta. Tuttavia, devo dire che non mi piace la tendenza del bootlegging delle risposte degli utenti precedenti per un karma economico (vedi la risposta di nlaq).
Priidu Neemre,

@PriiduNeemre, domanda posta e risposta accettata prima di oltre 7 anni e pensi che, tranne dalla tua lista, qualcuno darà voto? a parte questo, la tua risposta non è
all'altezza

2
after: boolean result =! isresult ();
Petter Friberg,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.