Java boolean
permite que los valores de true
y false
mientras booleana permite true
, false
y null
. He comenzado a convertir mi boolean
s a Boolean
s. Esto puede causar bloqueos en pruebas como
Boolean set = null;
...
if (set) ...
mientras la prueba
if (set != null && set) ...
Parece artificial y propenso a errores.
¿Cuándo, si alguna vez, es útil usar Boolean
s con valores nulos? Si nunca, ¿cuáles son las principales ventajas del objeto envuelto?
ACTUALIZACIÓN: Ha habido tantas respuestas valiosas que he resumido algunas de ellas en mi propia respuesta. En el mejor de los casos, soy un intermediario en Java, así que he intentado mostrar las cosas que encuentro útiles. Tenga en cuenta que la pregunta está "redactada incorrectamente" (el booleano no puede "tener un valor nulo") pero lo he dejado en caso de que otros tengan el mismo concepto erróneo
Boolean
variables paranull
ayudar.null
si realmente se usa como un tercer estado.Boolean
es un objeto, mientras que aboolean
es un "escalar". Si unaBoolean
referencia se establece en nulo, eso significa que elBoolean
objeto correspondiente no existe. No puedes colocar nada dentro de algo que no existe.Respuestas:
Use en
boolean
lugar deBoolean
cada vez que pueda. Esto evitará muchosNullPointerException
sy hará que su código sea más robusto.Boolean
es útil, por ejemploMessageFormat.format()
.fuente
Boolean isSchrodingerCatAlive = null;
(lo siento, no pude resistir;)).Casi nunca uso
Boolean
porque su semántica es vaga y oscura. Básicamente tiene lógica de 3 estados: verdadero, falso o desconocido. A veces es útil usarlo cuando, por ejemplo, le dio al usuario una opción entre dos valores y el usuario no respondió en absoluto y realmente quiere saber esa información (piense: columna de base de datos NULLable).No veo ninguna razón para convertir de
boolean
a,Boolean
ya que introduce una sobrecarga de memoria adicional, posibilidad de NPE y menos tipeo. Normalmente uso torpeBooleanUtils.isTrue()
para hacer mi vida un poco más fácilBoolean
.La única razón de su existencia
Boolean
es la capacidad de tener colecciones deBoolean
tipos (los genéricos no permitenboolean
, así como todas las demás primitivas).fuente
Boolean.TRUE.equals(myBooleanObject)
oBoolean.FALSE.equals(myBooleanObject)
.true
yfalse
. nonull
es un estado del objeto, sino un estado de la referencia del objeto.isTrue()
método ..." que suena como la cosa más tonta en la historia de las funciones de utilidad. Y sin embargo, de alguna manera, es útil ... esa es la mayor wtf aquí.Wow, que demonios? ¿Soy solo yo o todas estas respuestas son incorrectas o al menos engañosas?
La clase booleana es un contenedor alrededor del tipo primitivo booleano. El uso de este contenedor es para poder pasar un valor booleano en un método que acepte un objeto o genérico. Es decir, vector.
Un objeto booleano NUNCA puede tener un valor nulo. Si su referencia a un booleano es nula, simplemente significa que su booleano nunca fue creado.
Puede encontrar esto útil: http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/lang/Boolean.java
Una referencia booleana nula solo debe usarse para activar una lógica similar a la que tiene cualquier otra referencia nula. Usarlo para la lógica de tres estados es torpe.
EDITAR: aviso, esa
Boolean a = true;
es una declaración engañosa. Esto realmente equivale a algo más cercano aBoolean a = new Boolean(true);
Por favor vea autoboxing aquí: http://en.wikipedia.org/wiki/Boxing_%28computer_science%29#AutoboxingQuizás de aquí proviene gran parte de la confusión.
EDIT2: Lea los comentarios a continuación. Si alguien tiene una idea de cómo reestructurar mi respuesta para incorporar esto, hágalo.
fuente
Boolean a = true;
) y luego establecer un a nulo (a = null;
). Puede que no sea elegante o sabio, pero es posible.Boolean a
; a es un puntero a un objeto booleano. Si noa = null;
ha establecido su valor booleano en nulo, ha establecido su referencia en nulo. HacerBoolean a = null; a.booleanValue();
En este caso, ni siquiera se ha creado un objeto Boolean y por lo tanto se va a lanzar una NullPointerException. Avíseme si necesita más instrucciones.Boolean a = true;
, hace algún tipo de magia que en realidad se interpreta comoBoolean a = new Boolean(true);
Eso probablemente no sea completamente correcto por razones de rendimiento, pero debes darte cuenta de que el Booleano sigue siendo un objeto.Hay tres razones rápidas:
true
,false
onull
xsd:boolean
valores del esquema XML declarados conxsd:nillable="true"
List<Boolean>
- no puedes usarList<boolean>
fuente
boolean
" (estilo mental), porque en Oracle generalmente se usachar(1) null
con valores 'T' y 'F'. Por lo tanto, puede (con, por ejemplo, el adaptador de tipo Hibernate) ser nulo :)RESPUESTA A LA PROPIA PREGUNTA: Pensé que sería útil responder a mi propia pregunta, ya que he aprendido mucho de las respuestas. Esta respuesta está destinada a ayudar a aquellos, como yo, que no tienen una comprensión completa de los problemas. Si uso un lenguaje incorrecto, corrígeme.
true
yfalse
. Es la ausencia de un puntero a los objetos. Por lo tanto, pensar que Boolean tiene 3 valores es fundamentalmente incorrectoLa sintaxis para Boolean se abrevia y oculta el hecho de que la referencia apunta a Objetos:
Boolean a = true;
oculta el hecho de que
true
es un objeto. Otras tareas equivalentes pueden ser:o
La sintaxis abreviada
if (a) ...
es diferente de la mayoría de las otras asignaciones y oculta el hecho de que a podría ser una referencia de objeto o una primitiva. Si es un objeto, es necesario probarlo para
null
evitar NPE. Para mí es psicológicamente más fácil recordar esto si hay una prueba de igualdad:if (a == true) ...
donde se nos podría pedir que hagamos una prueba para nulo. Entonces, la forma abreviada solo es segura cuando
a
es primitiva.Para mí ahora tengo las recomendaciones:
Boolean
de un método como podría sernull
. Solo regresoboolean
.Boolean
para envolver elementos en contenedores o argumentos para métodos donde se requieren objetosfuente
Las clases de contenedor para primitivas se pueden usar donde se requieren objetos, las colecciones son una buena muestra.
Imagínese que usted necesita por alguna razón tienda de una secuencia de
boolean
en unaArrayList
, esto se puede hacer por el boxeoboolean
enBoolean
.Hay algunas palabras sobre esto aquí
De la documentación:
http://docs.oracle.com/javase/1.5.0/docs/guide/language/autoboxing.html
fuente
Boolean
wrapper es útil cuando quiere saber si el valor fue asignado o no, aparte detrue
yfalse
. Tiene los siguientes tres estados:null
Mientras que
boolean
solo tiene dos estados:La diferencia anterior lo hará útil en las Listas de
Boolean
valores, que pueden tenerTrue
,False
oNull
.fuente
Supongo que, en algún caso, debería tener un mecanismo para distinguir un campo booleano que ya haya establecido un valor o no.
fuente
El propósito principal de Boolean es el valor nulo. El valor nulo dice que esa propiedad no está definida , por ejemplo, tome la columna anulable de la base de datos.
Si realmente necesita convertir todo de booleano primitivo a booleano de envoltura, puede usar lo siguiente para admitir código antiguo:
fuente
¡Hay muchos usos para el valor ** nulo ** en el contenedor booleano! :)
Por ejemplo, puede tener en un formulario un campo llamado "boletín informativo" que indica si el usuario desea o no un boletín informativo de su sitio. Si el usuario no selecciona un valor en este campo, es posible que desee implementar un comportamiento predeterminado para esa situación (¿enviar ?, ¿no enviar ?, ¿pregunta nuevamente ?, etc.). Claramente, no establecido (o no seleccionado o ** nulo **), no es lo mismo que verdadero o falso.
Pero, si "no establecido" no se aplica a su modelo, no cambie la primitiva booleana;)
fuente
En una definición estricta de un elemento booleano, solo hay dos valores. En un mundo perfecto, eso sería cierto. En el mundo real, el elemento puede faltar o ser desconocido. Por lo general, esto implica la entrada del usuario. En un sistema basado en pantalla, podría ser forzado por una edición. En un mundo por lotes que utiliza una base de datos o una entrada XML, el elemento podría faltar fácilmente.
Entonces, en el mundo no perfecto en el que vivimos, el objeto booleano es excelente ya que puede representar el estado desconocido o perdido como nulo. Después de todo, las computadoras simplemente modelan el mundo real y deben tener en cuenta todos los estados posibles y manejarlos con excepciones de lanzamiento (principalmente porque hay casos de uso en los que lanzar la excepción sería la respuesta correcta).
En mi caso, el objeto booleano fue la respuesta perfecta ya que el XML de entrada a veces faltaba el elemento y todavía podía obtener un valor, asignarlo a un valor booleano y luego verificar un valor nulo antes de intentar usar una prueba verdadera o falsa con él .
Solo mis 2 centavos.
fuente
Para todas las buenas respuestas anteriores, solo voy a dar un ejemplo concreto en la
HttpSession
clase de servlet de Java . Espero que este ejemplo ayude a aclarar alguna pregunta que aún pueda tener.Si necesita almacenar y recuperar valores para una sesión, utilice el método
setAttribute
(String, Object) ygetAttribute
(String, Object). Entonces, para un valor booleano, está obligado a usar la clase booleana si desea almacenarlo en una sesión http.La última línea provocará un
NullPointerException
si los valores de los atributos no están establecidos. (que es la razón me llevó a esta publicación). Entonces, el estado lógico 3 está aquí para quedarse, ya sea que prefiera usarlo o no.fuente
La mejor manera sería booleanos evitar por completo, ya que cada booleano implica que usted tiene una sentencia condicional en cualquier otro lugar en el código (ver http://www.antiifcampaign.com/ y esta pregunta: ¿Se puede escribir cualquier algoritmo sin una sentencia if ? )
Sin embargo, pragmáticamente tiene que usar booleanos de vez en cuando, pero, como ya lo ha descubierto usted mismo, tratar con booleanos es más propenso a errores y más engorroso. Así que sugeriría usar booleanos siempre que sea posible. Las excepciones a esto podrían ser una base de datos heredada con columnas booleanas anulables, aunque también trataría de ocultar eso en mi mapeo.
fuente
Boolean puede ser muy útil cuando necesita tres estados. Al igual que en las pruebas de software, si se pasa la prueba, envíe verdadero, si falla, envíe falso y si el caso de prueba se interrumpe, envíe nulo, lo que indicará que el caso de prueba no se ejecutó.
fuente