generic java boolean autoboxing

java - generic - Booleano!=Falso



generic java (12)

Buenas ilustraciones de la diferencia entre el booleano primitivo y el objeto booleano . Lo primero solo puede ser verdadero o falso . Este último puede ser verdadero , falso o desconocido / indefinido . (es decir, nulo). El uso que haga dependerá de si desea tratar dos casos de uso o tres.

En Java, normalmente dirías que

if(someBool != false)

es lo mismo que

if(someBool)

Pero, ¿qué someBool si someBool no es de tipo boolean sino Boolean y su valor es null ?


Como Boolean le dará un objeto, siempre debe verificar si está NULL antes de trabajar en el objeto.


En realidad, el constructor booleano acepta nulo, devuelve FALSO y no lanza un NullPointerTantrum.

new Boolean(null); <false>

Esto tiene la ventaja adicional de que también da una respuesta inteligente a la cadena "true" que no es el caso de Boolean.TRUE.equals pero estamos más restringidos nuevamente al tener solo constructores para Strings y Booleans.

Algo que se puede superar con la concatenación de cadenas, que también es a prueba de nulos.

new Boolean(""+null); <false> new Boolean(""+false); <false> new Boolean(""+new Object()); <false> new Boolean(""+6); <false> new Boolean(""+new Integer(9)); <false>

Asegurarse de que todas las opciones VERDADERAS, disponibles en java, permanezcan.

new Boolean(""+true); <true> new Boolean(""+"true"); <true>


Es antiguo, pero Boolean.valueOf(null) es false , al igual que Boolean.valueOf(false) es false .


Hice una pequeña prueba:

Boolean o = null; try { System.out.println(o ? "yes" : "no"); } catch (Exception e) { e.printStackTrace(); } try { System.out.println((o != false) ? "yes" : "no"); } catch (Exception e) { e.printStackTrace(); }

La salida es sorprendente:

java.lang.NullPointerException at btest.main(btest.java:10) java.lang.NullPointerException at btest.main(btest.java:15)

Se espera el primer NPE, porque o se autonboxing (y eso falla porque es nulo). El segundo sucede por la misma razón, pero no se siente natural. De todos modos, la solución es hacer:

System.out.println(!Boolean.FALSE.equals(o) ? "yes" : "no");


Si someBool es Boolean

if (someBull != null && someBull) { //Yeah, true. }

Dado que Boolean puede ser null asegúrese de evitar NullPointerException comprobando que no sea nulo.


Si desea manejar instancias Boolean así como primitivas y ser seguro de nulos, puede usar esto:

if(Boolean.TRUE.equals(someBool))


Si es Java 7+ puedes usar

import java.util.Objects;

Y

if (Objects.equals(someBool, true))


Si es nulo, obtendrás una NullPointerException


Sin embargo, puede comparar un booleano nulo con una instancia booleana. Por ejemplo :

Boolean myBool = null; System.out.println(myBool == Boolean.FALSE); System.out.println(myBool == Boolean.TRUE);

impresiones:

false false


Utilice ApacheCommons BooleanUtils.isTrue () o .isFalse ()


autounboxing una NullPointerException ( autounboxing of null throws NPE).

Pero eso solo significa que no debe permitir un valor null . Utilice un valor predeterminado, o no use el autounboxing y realice una comprobación no nula. Porque usar un valor null de un valor booleano significa que tienes 3, no 2 valores. (Michael y Tobiask propusieron mejores formas de manejarlo)