1

estoy realizando unas prueba unitarias en la cual debo comparar dos objetos Boolean los cuales tienen valor true, pero el problema es que el resultado de la comparación es false, si realizo el mismo ejercicio con boolean de tipo primitivo devuelve true. ¿ Alguna explicación de por que al comparar dos Objetos Boolean con valor true el resultado es false ?

Mi codigo

@Test
public void compararBooleanTest() {

    Boolean a = new Boolean(true);
    Boolean b = new Boolean(true);
    System.out.println(a == b);
    System.out.println(a && b);

    boolean c = a.booleanValue();
    boolean d = b.booleanValue();
    System.out.println(c == d);
    System.out.println(c && d);

}

Resultado

false
true
true
true

3 Answers3

4

Porque, como dijiste; son Objetos Boolean. Cuando haces:

Objeto == Objeto

Lo que hace el lenguaje es preguntar: ¿La dirección de memoria del primer objeto, es la misma dirección de memoria que la del segundo? Al tratarse de instancias diferentes, esto da false.

Para comparar usando Objetos, tienes que usar alguno de los métodos provistos por la clase Boolean. Como por ejemplo:

Boolean a = new Boolean(true);
Boolean b = new Boolean(true);
System.out.println(a.equals(b)); // => true;

Otra forma de usar la clase Boolean para hacer comparaciones podría ser usando:

Boolean c = Boolean.TRUE;
Boolean d = Boolean.TRUE;
System.out.println(c == d); // => true;

Acá Java convierte a estos en tipos primitivos automáticamente si es necesario.

Por lo general, te diría que evites usar la clase Boolean cuando puedas, y optes por usar directamente los booleanos primitivos.
Salvo en los escenarios que quieras/necesites trabajar con un Booleano null. (@Marcos Martínez).


En este último caso, si tu objeto Boolean resultara ser null, tendrás que tener cuidado cuando quieras controlar, ya que:

Boolean a = null;

if (a.equals(true)) {
    // => true?    
} else if (a.equals(false)) {
    // => false?    
}

Te lanzará un NullPointerException ya que a al ser null, no cuenta con ningún método equals. Para prevenir esto, podrías evaluar de la siguiente forma:

Boolean a = null; // || new Boolean(false); || new Boolean(true);

if (Boolean.TRUE.equals(a)) {
    // => true
} else if (Boolean.FALSE.equals(a)) {
    // => false    
}

Nota: Usar new Boolean(null); o new Boolean("cualquier-cosa"); cumplirá con la condición de ser igual a Boolean.FALSE.

Francute
  • 1,568
  • 6
  • 15
  • 2
    El primer código de ejemplo que utilizas es justamente una comparación por referencia de dos Boolean e imprimirá "false", supongo que te referías al método equals. ¿Por qué dices de evitar dicha clase? En muchas ocasiones poder definir una variable booleana con el valor null es provechoso. – Marcos Martínez Aug 10 '17 at 01:45
  • 1
    Tenés razón en todo. Estaba seguro que lo había cambiado por un *equals*. Pero definitivamente no lo hice. Moco importante mío. Muchas gracias :). En cuanto a lo segundo, no sé cómo se procede en estos casos en *SO*, así que decidí *citarlo* en la respuesta con la notación común para citar a un usuario, aunque no se genera el enlace hacia tu perfil. No sé si te parece correcto que haya hecho esto, o qué debería hacer en este caso. De nuevo, muchas gracias las observaciones. – Francute Aug 10 '17 at 12:53
0

Cómo tu mismo lo has dicho, estás comparando objetos Boleanos.

La mejor manera de comparar Objetos es mediante el método equals ya que la clase Boolean la sobreescribe:

Boolean a = new Boolean(true);
Boolean b = new Boolean(true);

a.equals(b); // true

si comparas ( a==b ) estás comparando las referencias en memoria.

Es recomendable usar los tipos de datos primitivo ya que son mas eficientes que los Primitive Wrapper Class.

Marcos Martínez
  • 2,322
  • 1
  • 11
  • 21
  • Edwin, si bien tu respuesta es correcta, para comparar objetos de manera segura deberías chequear si no son nulos previamente, de lo contrario obtendras NullPointerException – Marcos Martínez Aug 10 '17 at 12:37
  • Estimado Marcos, estoy asumiendo que se verificó antes eso. De todas maneras el métoco equals maneja el argumento nulo ya que si tu pasas null el resultado será false. – Edwin Cotrina Aug 10 '17 at 16:03
0

lo mas sencillo es obtener el valor del tipo primitivo boolean de la clase Boolean, con lo que la comparación sería así:

Boolean valor1 = new Boolean(true);
Boolean valor2 = new Boolean(true);

if(valor1.booleanValue() == valor2.booleanValue())