2012-03-13 24 views
8

El título es bastante autoexplicativo. Me estoy moviendo de C# a Java. Tengo un objeto y un método getter que devuelve su ID. Quiero comparar los identificadores de dos objetos del mismo tipo y verificar si los valores de sus identificadores son iguales.Compara dos variables primitivas largas en java

trataron:

obj.getId() == obj1.getId(); 

Long id1 = obj.getId(); 
Long id2 = obj1.getId(); 

assertTrue(id1.equals(id2)) 

assertTrue(id1== id2) 
+0

En realidad, esta pregunta es confusa porque no se trata de comparar, sino de probar la igualdad. Ver http://docs.oracle.com/javase/7/docs/api/java/lang/Comparable.html#compareTo(T) –

Respuesta

21

en Java:

  • == el operador le indica si los dos operandos son mismo objeto (instancia).
  • el método .equals() en Long indica si son con el mismo valor.

Pero no deberías hacer ninguna de las dos cosas.La forma correcta de hacerlo es la siguiente:

assertEquals(id1, id2); 

Con assertEquals(), si falla la afirmación, el mensaje de error le dirá lo que eran los dos valores, por ejemplo expected 2, but was 5 etc

1

Necesita ser consciente de la diferencia entre Long y long-long es el tipo primitivo, Long es el tipo de envoltura. (Un poco como un valor en caja en C#, pero fuertemente tipado.) ¿Cuál es el tipo de devolución de getId()?

Simplemente:

assertEqual(id1, id2); 

debe estar bien si está haciendo esto en una prueba. De lo contrario, podría utilizar:

if (id1.equals(ids2)) 

si son definitivamente no nulo, o utilizar Guava:

if (Objects.equal(id1, id2)) 

para manejar nulidad. (Puede escribir Objects.equal a sí mismo, por supuesto, pero que sin duda debe hacerse con guayaba todos modos, por lo que también podría usar eso ...)

Vale la pena señalar que ciertos objetos envolventes se vuelven a utilizar - así por ejemplo, :

// This will work 
Long x = 5L; 
Long y = 5L; 
assertTrue(x == y); // Reference comparison 

// This *probably* won't but it could! 
x = 10000L; 

y = 10000L; assertTrue (x == y); // comparación de referencia

2

trate de hacer lo siguiente:

assertTrue(id1.longValue() == id2.longValue()) 
1

en Java,

use == para comparar primitivas y x.equals(y) para comparar objetos.

No estoy seguro de cuál es su pregunta, parece que usted intentó ambas, ¿y no funcionó?

Nota, que está utilizando en lugar de Longlong, por lo que desea utilizar .equals()

(long es un primitivo, Long es un objeto)

+0

¡Gracias! Estaba comparando las fechas modificadas de dos archivos que deberían haber sido iguales (porque uno estaba configurado para el otro), pero == siempre estaba fallando, aunque cuando establecí los puntos de interrupción y los comprobé, eran idénticos. Resulta que mi error fue la L mayúscula en "Long jFileTime = jFile.lastModified();" ... lo reemplazó con una l minúscula y de repente mi == comparación comenzó a funcionar. Es realmente molesto que no dé ninguna advertencia al compilador sobre cómo se produce un lanzamiento implícito y no explícito ... – ArtOfWarfare

2

Ellos no deben ser iguales usando ==. Utilizar cualquiera:

id1.equals(id2) 

o

id1.longValue() == id2.longValue() 

En ambos casos me he dejado nulos cheques porque dudo que las olvide, si se necesitaban aquí;)

Así que, ¿por qué ¿Long no siempre es == otro Largo con el mismo valor? La respuesta es fácil. ¡Son objetos diferentes! Dependiendo de cómo se recuperó el Long, podrían ser iguales debido al almacenamiento en caché interno. Ver Long.valueOf.

2

Además de todos los comentarios acerca de la comparación correcta, la tipificación fuerte puede ayudarlo a resolver su problema.

¿getID() devuelve algo del tipo Long (que es un tipo de clase) o de tipo long (que es un tipo primitivo)? El problema es que si el método devuelve un valor primitivo, entonces la comparación con '==' y 'igual()' funcionará, porque Java arroja primitivas automáticamente en objetos envoltorios cuando los necesita.

Pero a la inversa, si getID() devuelve un valor Long, es probable que falle la comparación con '==', porque eso verifica si tiene el mismo objeto, no si los objetos tienen el mismo valor.

Cuestiones relacionadas