2011-02-04 1 views
23

PD: entiendo la diferencia entre "verdadero" y verdadero.¿Cuál es la diferencia entre Boolean.TRUE y true en Java?

Edit: También entiendo que Boolean.TRUE es un contenedor para el verdadero primitivo, mi pregunta es: ¿por qué la booleana primitiva acepta Boolean.TRUE como valor? Por ejemplo,

boolean boolVar = Boolean.TRUE; 

parece que hay una instrucción válida.

+0

http://stackoverflow.com/questions/4531767/what-is-the-difference-between-the-boolean-object-and- the-boolean-data-type-in-ja –

+0

El enlace no responde por qué 'boolean boolVar = Boolean.TRUE;' es una declaración válida y significativa. Digo significativo porque hace lo que parece :) – user183037

+1

Esto se debe a que el enlace abordaba la pregunta que usted hizo antes de la edición. –

Respuesta

27

La razón

boolean boolVar = Boolean.TRUE; 

obras es debido autounboxing, una característica de Java 5 que permite que un objeto contenedor que se convierte en su equivalente primitiva automáticamente cuando sea necesario. Lo contrario, autoboxing, también es posible:

Boolean boolVar = true; 
+0

Excelente - ¡Olvidé todo sobre el autoenvasado! ¿Pero por qué tener Boolean.TRUE en primer lugar? – user183037

+1

@ user183037: para que pueda usar el objeto directamente cuando lo necesite en lugar de tener que pasar por el autoboxing. En cuanto a la constante en sí misma, quiere que todas las instancias de 'Boolean' en un sistema sean uno de dos objetos,' Boolean.TRUE' o 'Boolean.FALSE'. Siempre que no uses el constructor para 'Boolean', este es el caso. – ColinD

+2

Más al punto, solo quiere un único objeto booleano en la máquina virtual con un valor 'verdadero'. Del mismo modo para 'falso'. En otras palabras, dos objetos booleanos que son 'igual()' también son '==' --es decir, el mismo objeto (idéntico). –

2

true es de la primitiva boolean tipo mientras Boolean.TRUE es un objeto Boolean que envuelve el valor true.

+0

Por favor, mira mi edición - He reformulado la pregunta un poco. – user183037

0

Boolean.TRUE es una referencia a un objeto de la clase Boolean, mientras que true es solo un valor del tipo booleano primitivo. Las clases como Boolean a menudo se denominan "clases contenedoras" y se usan cuando necesita un objeto en lugar de un tipo primitivo (por ejemplo, si lo está almacenando en una estructura de datos).

+0

Por favor, mira mi edición - He reformulado la pregunta un poco. – user183037

5

Boolean.TRUE es un objeto contenedor y singleton. true es una constante literal. A continuación se presentan 2 situaciones en las que utilizo envoltorios más primitivas

  1. quiero almacenarlos en las colecciones
  2. que me gustaría tener una noción de nula. primitivo booleano solo puede representar dos estados.
+0

Por favor, mira mi edición - He reformulado la pregunta un poco. – user183037

22

Como las respuestas anteriores han dicho, Boolean.TRUE devuelve el envoltorio objeto del valor booleano true, por lo que para los contextos en los que necesitamos para tratar de booleanos como objetos (por ejemplo, tener un ArrayList de booleanos), podríamos usar Boolean.TRUE o Boolean.FALSE

cuanto a por qué:

boolean boolVar = Boolean.TRUE; 

es válido es por Autoboxing and Unboxing.

En pocas palabras, el compilador de Java, cuando se ve que el tratamiento de una primitiva como un objeto, como por ejemplo

List<Boolean> listOfBoolean = new ArrayList<Boolean>(); 
boolean someBool = true; 
listOfBoolean.add(someBool); 

se ajuste automáticamente, o autobox de que

List<Boolean> listOfBoolean = new ArrayList<Boolean>(); 
boolean someBool = true; 
listOfBoolean.add(Boolean.valueOf(someBool)); 

Y si lo ve tratando un objeto contenedor, como Boolean.TRUE, como primitivo, como:

boolean boolVar = Boolean.TRUE; 

lo convertirá abajo en una primitiva, o unbox él, como si lo hicimos:

boolean boolVar = Boolean.TRUE.booleanValue(); 

Había una vez, que tendría que hacerlo a mano, pero ahora, para una mejor o para peor, esto es principalmente cuidado por ti.

Y si se está preguntando por qué tiene Boolean.TRUE en absoluto, es porque no hay necesidad de tener flotando alrededor de muchos objetos booleanos para true. Desde un booleano sólo puede ser uno de dos valores, es más sencillo sólo para tenerlos como constantes en lugar de, por cada vez que alguien necesita en caja hasta true:

Boolean trueBool = new Boolean(true); 
+0

Parece que no puedo aceptar 2 respuestas, así que acepté Colin como lo publicó anteriormente, pero su explicación detallada tiene mucho sentido, ¡gracias! – user183037

+0

@ user183037 Está bien, estoy contento de ayudar :-) –

0

También puede obtener una explicación sobre el enlace de Wikipedia debajo .

Todas las clases de envoltura primitiva en Java son inmutables. J2SE 5.0 introdujo el autoboxing de tipos primitivos en su objeto contenedor, y el unboxing automático de los objetos del contenedor en su valor primitivo, la conversión implícita entre los objetos del contenedor y los valores primitivos.

Más en http://en.wikipedia.org/wiki/Primitive_wrapper_class

0

tipos primitivos, (E.I. boolean), se prefieren claramente más clases (E.I. Boolean) para una serie de razones. Ver discusión aquí. https://softwareengineering.stackexchange.com/questions/203970/when-to-use-primitive-vs-class-in-java. El tipo primitivo hace que el código sea más legible, previene los errores del puntero, como if(a==b) frente a if(a.equals(b)), aumenta el rendimiento y sigue la conversión.

Hay un caso cuando Boolean o Integer funciona mejor que boolean y int. Es decir, si tiene una situación en la que desea permitir null como valor. Esto da como resultado una serie de comprobaciones nulas, pero evita que false se salga cuando

Cuestiones relacionadas