2012-08-06 14 views
28

Eventuali duplicati:
Is it bad to explicitly compare against boolean constants e.g. if (b == false) in Java?se (booleano == false) vs. se (booleano!)

In this NotePadProvider sample code, ho notato che l'autore ha scelto la forma:

if (values.containsKey(NoteColumns.CREATED_DATE) == false) { 
     values.put(NoteColumns.CREATED_DATE, now); 
    } 

Oltre:

if (!values.containsKey(NoteColumns.CREATED_DATE)) { 
     values.put(NoteColumns.CREATED_DATE, now); 
    } 

Esiste un vantaggio del primo modulo rispetto a quello più logico?

+4

È più leggibile. –

+10

@Lukas Knuth Davvero? Penserei il contrario ... – ateiob

+0

Correlati: [È male confrontare esplicitamente con le costanti booleane, ad es. if (b == false) in Java?] (http://stackoverflow.com/questions/2661110/is-it-bad-to-explicitly-compare-against-boolean-constants-eg-if-b-false- i) – BalusC

risposta

51

Oltre alla "leggibilità", n. Sono funzionalmente equivalenti.

("leggibilità" è tra virgolette perché io odio == false e trovare ! molto più leggibile. Ma altri no.)

+1

Penso che vada oltre l'argomento di leggibilità. ! (l'operatore bang) è stato creato per questo scopo. Dovresti usarlo perché ti aiuta a scrivere queste affermazioni in un modo succinto. È possibile scrivere codice utilizzando un numero più limitato di operatori, ma il codice risulterà in una posizione leggibile e non seguirà le convenzioni utilizzate da tutti. – user2481095

5

Questa è una scelta di stile. Non ha alcun impatto sulle prestazioni del codice, lo rende solo più prolisso per il lettore.

3

No. Non vedo alcun vantaggio. Il secondo è più stretto.

btw: il secondo stile si trova in ogni angolo della sorgente JDK.

4

- Qui la sua più sulla coding style che essere il funzionalità ....

- L'prima opzione è molto chiaro, ma poi il secondo uno è molto elegante. .. senza offesa, è solo il mio punto di vista ..

7

Principalmente la LETTURA. Quando si legge il codice di altri, è molto più intuitivo leggere come NON CONTIENE CHIAVE!values.containsKey(NoteColumns.CREATED_DATE) invece di leggere CONTAINS KEY IS FALSE(values.containsKey(NoteColumns.CREATED_DATE) == false).

1

Il primo modulo, se utilizzato con un'API che restituisce Boolean e confrontato con Boolean.FALSE, non genererà mai uno NullPointerException.

La seconda forma, quando viene utilizzato con l'interfaccia java.util.Map, anche, non potrà mai gettare un NullPointerException perché restituisce un boolean e non un Boolean.

Se non ti preoccupi degli idiomi coerenti di codifica, puoi scegliere quello che ti piace, e in questo caso concreto non importa. Se si fare attenzione sulla codifica coerente, quindi prendere in considerazione ciò che si desidera fare quando si controlla un Boolean che potrebbe essere NULL.

+1

Questa potrebbe essere una risposta veramente illuminante, se solo ho capito dove vedi un 'Boolean'. Tutto quello che vedo è un 'booleano'. Spiega per favore. – ateiob

+0

"In questo caso concreto non importa davvero." Come giustamente fai notare, non c'è alcun booleano mostrato sopra. La mia preoccupazione riguardava il futuro codice che potrebbe restituirti un tipo booleano e potrebbe essere nullo. Se credi che ciò accadrà, "non accadrà mai", allora questa risposta non è molto utile. – Sam

2

Nota: Con ConcurrentMap è possibile utilizzare il più efficiente

values.putIfAbsent(NoteColumns.CREATED_DATE, now); 

io preferisco la soluzione meno prolisso e evitare metodi come IsTrue o IsFalse o loro simili.

+0

Eccellente. Amo questo. Poiché [ConcurrentMap] (http://developer.android.com/reference/java/util/concurrent/ConcurrentMap.html) non deriva da [ContentValues] (http://developer.android.com/reference/android/ content/ContentValues.html) e non esiste una connessione diretta tra i due, hai qualche suggerimento per convertire il parametro 'ContentValues' passato in' ConcurrentMap'? Oh aspetta, 'ConcurrentMap' è un'interfaccia ** **! Fammi controllare, non ho mai incontrato 'ConcurrentMap' prima. – ateiob

+0

Interessante, non estende nemmeno Map e non sono sicuro che il thread sia sicuro. Potresti scrivere un metodo 'putIfAbsent (ContentValues, NoteColumns.CREATED_DATE, now)'. ;) –