float - long java max value
¿Cuál es la diferencia entre false y Boolean.FALSE? (8)
En C ++ windows.h FALSE
se define como un entero, lo cual tiene sentido para algunos casos de lógica especial, pero en Java java.lang.Boolean.FALSE
se define como booleano y se asigna a falso
public static final Boolean FALSE
y he visto a algunas personas usarlo.
Mi pregunta: ¿hay una diferencia de rendimiento entre false
y Boolean.FALSE
? en general ¿por qué la gente va y Boolean.FALSE
?
Consulte http://docs.oracle.com/javase/7/docs/api/java/lang/Boolean.html .
Boolean.TRUE
y Boolean.FALSE
no son boolean
, son Boolean
. Son instancias estáticas de los dos objetos envoltorios Boolean
que corresponden a los valores boolean
true
y false
.
Boolean
es similar a una enum
. Las instancias TRUE
y FALSE
son las instancias devueltas por Boolean.valueOf()
.
En cuanto al rendimiento de primitivo vs. envoltorio; no hay ninguna diferencia por la que deba preocuparse. Las instancias estáticas TRUE
y FALSE
ayudan un poco al rendimiento, y los javadocs recomiendan usar Boolean.valueOf()
en lugar de un new Boolean(...)
por ese motivo. Los valores booleanos true
y false
son un poco "nivel inferior", pero si los almacena en un Boolean
(en lugar de boolean
) de todos modos es irrelevante.
Debe usar lo que sea más sensato para su código y lograr la mejor legibilidad (y, definitivamente, no comience a tomar el camino de pensar en las microoptimizaciones como los tipos primitivos frente a los de envoltura). Si está utilizando un valor Boolean
, utilice los valores de objeto. Si está utilizando un valor boolean
, utilice los valores primitivos. Si está decidiendo entre Boolean
y Boolean
, use lo que sea más apropiado (por ejemplo, un Boolean
puede ser null
, lo que puede ser útil, y también no puede usar tipos primitivos para parámetros de tipo genérico; por otro lado, un boolean
nunca puede ser null
que podría ser igualmente útil).
También tenga en cuenta que el boxeo automático convierte los tipos primitivos en una de esas dos instancias Boolean
estáticas, por ejemplo:
Boolean a = true;
assert(a == Boolean.TRUE);
Como nota aparte, como lo mencionó: FALSE
se define en windows.h
por dos razones: 1) Porque windows.h
ha estado en uso desde los días de solo C, y C no tiene un tipo de bool
nativo, y 2) Es la práctica tradicional de Microsoft definir tipos de datos y valores con tamaños y valores explícitos y conocidos, esp. para pasar datos a las funciones de la API de Windows a través de los límites de DLL (más allá del alcance de esta pregunta) y para integrarlos con otros lenguajes que tengan representaciones diferentes de "verdadero" y "falso". No tiene Boolean.FALSE
relación con los motivos de Boolean.FALSE
en Java.
En lo que respecta al rendimiento, Boolean.FALSE
devolverá un objeto Boolean
, que podría darle más flexibilidad para trabajar.
La alternativa primitiva ocupa menos memoria.
En primer lugar, si no está claro con esto, necesita saber que en Java no se pueden convertir implícitamente números booleanos, por ejemplo, no puede compilar algo como:
int a = 1;
if(a){
//something, something
}
En segundo lugar, algunas consideraciones sobre el rendimiento. Siempre hay una compensación.
Cuando se utiliza el tipo boolean
primitivo, el rendimiento debería ser mejor porque está usando un valor directamente, que es true
o false
(obviamente, codificado en bytes).
Cuando se utiliza el tipo de objeto Boolean
, una variable / campo mantendrá un valor, pero ese valor no se puede usar de inmediato, ya que ese valor es de hecho la referencia a un objeto, por lo que podría tener una penalización de rendimiento. Por supuesto, esta sanción no es significativa en la mayoría de los casos. Y, si desarrolla una aplicación de tiempo crítico, lo más probable es que no esté utilizando Java :). Sin embargo, el uso de tipos de objetos puede aportar algunos beneficios en el proceso de desarrollo y la seguridad en la implementación de casos de uso (por ejemplo, permite valores nulos, lo cual es crítico cuando se asignan entidades JPA a tablas relacionales y hay columnas de tipo bit que permiten valores nulos; y esto es solo un escenario donde el tipo de objeto es mejor).
Al final, tenga en cuenta el boxeo / no-boxeo, que permite a los desarrolladores utilizar variables de tipo boolean
casi todas partes donde se espera una variable de tipo Boolean
(y al revés).
Es una pregunta muy extraña, porque false
es el valor del tipo boolean
primitivo, mientras que Boolean.FALSE
es una variable del tipo Boolean
de referencia. Su valor es referencia al objeto de tipo Boolean
cuyo estado interno booleano es false
.
Boolean
es útil cuando necesitas una variable de tres estados.
Además, es posible que desees consultar este tutorial de autoboxing y unboxing , así como las reglas sobre cómo funciona .
Boolean
es una clase de envoltorio para el tipo primitivo booleano, igual que tenemos Integer para int.
Booleano tiene muchos métodos para jugar con el tipo primitivo boolean
http://docs.oracle.com/javase/6/docs/api/java/lang/Boolean.html
false
es un objeto primitivo y Boolean.FALSE
es un objeto, por lo que no son realmente comparables.
Si asigna false
a una variable Boolean
, como esto:
Boolean b = false;
El boxeo automático de Java ocurre para convertir el primitivo en un objeto, por lo que el valor false
se pierde y terminas con Boolean.FALSE
todos modos.
En términos de rendimiento, el uso de una variable primitiva superaría ligeramente el rendimiento de un objeto Boolean
envolvente, pero su elección debe basarse en la legibilidad y en las decisiones de diseño básicas en lugar de en el "rendimiento".
Boolean a = null;
if (a) {
// NullPointerException
}
if (a != false) {
// NullPointerException
}
// Caution, comparing by reference, meaning 2 Booleans with same value could be different
if (a != Boolean.FALSE) {
System.out.println("But this one works");
}