2012-08-06 10 views
28

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

En this NotePadProvider sample code, me di cuenta de que el autor eligió la forma:

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

Over:

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

¿Existe una ventaja de la primera forma sobre la más lógica?

+4

Es más legible. –

+10

@Lukas Knuth realmente? Pensaría lo contrario ... – ateiob

+0

Relacionado: [¿Es malo comparar explícitamente contra las constantes booleanas, p. if (b == false) en Java?] (http://stackoverflow.com/questions/2661110/is-it-bad-to-explicitly-compare-against-boolean-constants-eg-if-b-false- i) – BalusC

Respuesta

51

Aparte de "legibilidad", no. Son funcionalmente equivalentes.

("legibilidad" está entre comillas porque no me gusta == false y encuentro ! mucho más legible. Pero otros no lo hacen.)

+1

Creo que incluso va más allá del argumento de legibilidad. ! (el operador de bang) fue creado para este propósito. Debe usarlo porque le ayuda a escribir estas declaraciones de manera sucinta. PUEDE escribir código usando una gama de operadores más limitada, pero su código será una mierda desde el punto de vista de la legibilidad y no seguirá las convenciones que todos usan. – user2481095

5

Esta es una elección de estilo. No afecta en absoluto el rendimiento del código, solo lo hace más detallado para el lector.

3

No. No veo ninguna ventaja. El segundo es más estrecho.

btw: El segundo estilo se encuentra en cada esquina de la fuente JDK.

4

- aquí su más acerca de la coding style de ser el funcionalidad ....

- El primera opción es muy clara, pero luego el segundo uno es bastante elegante. .. sin ofender, es solo mi punto de vista ..

7

Mayormente READABILITY. Al leer código de otros, es mucho más intuitivo leer como NO CONTIENE LA CLAVE!values.containsKey(NoteColumns.CREATED_DATE) en lugar de leer CONTIENE LA LLAVE ES FALSA(values.containsKey(NoteColumns.CREATED_DATE) == false).

1

El primer formulario, cuando se usa con una API que devuelve Boolean y se compara con Boolean.FALSE, nunca lanzará un NullPointerException.

La segunda forma, cuando se utiliza con la interfaz java.util.Map, también, nunca tirar una NullPointerException porque devuelve un boolean y no un Boolean.

Si no le preocupan las expresiones de codificación consistentes, puede elegir la que más le guste, y en este caso concreto, realmente no importa. Si se preocupan por la codificación consistente, entonces considere lo que quiere hacer cuando marca Boolean que puede ser NULL.

+1

Esta podría ser una respuesta realmente esclarecedora, si solo entendiera dónde se ve un 'booleano'. Todo lo que veo es un 'boolean'. Por favor explique. – ateiob

+0

"En este caso concreto, realmente no importa". Como bien lo señala, no hay ningún booleano mostrado arriba. Mi preocupación era por un código futuro que podría devolverle un tipo booleano y podría ser nulo. Si crees que esto sucederá, "nunca sucederá", entonces esta respuesta no es muy útil. – Sam

2

Nota: Con ConcurrentMap puede utilizar la más eficiente

values.putIfAbsent(NoteColumns.CREATED_DATE, now); 

prefiero la solución menos detallado y evito métodos como isTrue o es falsa o sus semejantes.

+0

Excelente. Me encanta esto. Dado que [ConcurrentMap] (http://developer.android.com/reference/java/util/concurrent/ConcurrentMap.html) no se deriva de [ContentValues] (http://developer.android.com/reference/android/ content/ContentValues.html) y no existe una conexión directa entre los dos, ¿tiene alguna sugerencia para convertir el parámetro 'ContentValues' pasado en' 'ConcurrentMap'? ¡Oh, espera, 'ConcurrentMap' es una ** interfaz **! Déjame ver esto, nunca me encontré con 'ConcurrentMap' antes. – ateiob

+0

Interesante, ni siquiera extiende Map y no estoy seguro de que sea seguro. Puede escribir un método 'putIfAbsent (ContentValues, NoteColumns.CREATED_DATE, now)'. ;) –