2012-03-13 14 views
8

Il titolo è abbastanza auto-esplicativo. Sto passando da C# a Java. Ho un oggetto e un metodo getter che restituisce il suo ID. Voglio confrontare gli ID di due oggetti dello stesso tipo e controllare se i valori dei loro ID sono uguali.Confronta due primitive variabili lunghe in java

provato:

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

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

assertTrue(id1.equals(id2)) 

assertTrue(id1== id2) 
+0

In realtà questa domanda è fonte di confusione perché non si tratta di un confronto, ma di un test per l'uguaglianza. Vedi http://docs.oracle.com/javase/7/docs/api/java/lang/Comparable.html#compareTo(T) –

risposta

21

in Java:

  • l'operatore == ti dice se i due operandi sono gli stessi oggetto (istanza).
  • il metodo .equals() su Long indica se sono pari a uguale a.

Ma non si dovrebbe fare neanche.Il modo corretto per farlo è questo:

assertEquals(id1, id2); 

Con assertEquals(), se l'asserzione non riesce, il messaggio di errore vi dirà quali sono i due valori erano, ad esempio, expected 2, but was 5 ecc

1

Devi essere a conoscenza della differenza tra Long e long-long è il tipo primitivo, Long è il tipo wrapper. (Un po 'come un valore in box in C#, ma fortemente digitato.) Qual è il tipo di ritorno di getId()?

Semplicemente:

assertEqual(id1, id2); 

dovrebbe andare bene se si sta facendo questo in un test. Altrimenti, si può usare:

if (id1.equals(ids2)) 

se sono sicuramente non nullo, o utilizzare Guava:

if (Objects.equal(id1, id2)) 

per gestire la nullità. (È possibile scrivere Objects.equal da soli, naturalmente, ma si dovrebbe assolutamente entrare in possesso di Guava comunque, così si potrebbe anche utilizzare tale ...)

Vale la pena notare che alcuni oggetti wrapper vengono riutilizzati - così per esempio :

// 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); // confronto di riferimento

2

provare a fare quanto segue:

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

in java,

utilizzare == per confrontare le primitive e x.equals(y) per confrontare gli oggetti.

Non sono sicuro di quale sia la tua domanda-- sembra che tu abbia provato entrambi e non ha funzionato?

Nota, si sta utilizzando Long invece di long, in modo che si desidera utilizzare .equals()

(long è un primitivo, Long è un oggetto)

+0

Grazie! Stavo confrontando le date modificate di due file che avrebbero dovuto essere uguali (perché uno era impostato sull'altro), ma == stava sempre fallendo, anche se quando ho impostato i breakpoint e li ho controllati, erano identici. Si è scoperto che il mio errore era la L maiuscola in "Long jFileTime = jFile.lastModified();" ... l'ho sostituita con una l minuscola e improvvisamente il mio == confronto ha iniziato a funzionare. Davvero fastidioso che non dia alcun avvertimento al compilatore su come ho un cast implicito, non esplicito, che si verifica ... – ArtOfWarfare

2

Essi non devono essere uguali usando ==. Utilizzare:

id1.equals(id2) 

o

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

In entrambi i casi ho lasciato fuori nulli controlli perché dubito che li avrebbe dimenticato, se ne fosse stato bisogno qui;)

Quindi, perché è lungo non sempre == altro lungo con lo stesso valore? La risposta è facile. Sono oggetti diversi! A seconda di in cui è stato recuperato il valore, Long potrebbe essere lo stesso, a causa del caching interno. Vedi Long.valueOf.

2

Oltre a tutti i commenti sul confronto giusto, una digitazione forte può aiutarti a risolvere il problema.

getID() restituisce qualcosa di tipo Long (che è un tipo di classe) o di tipo long (che è un tipo primitivo)? Il problema è che se il metodo restituisce un valore primitivo, il confronto con '==' e 'equals()' funzionerà entrambi, perché Java esegue automaticamente il cast delle primitive in oggetti wrapper quando ne hai bisogno.

Ma viceversa, se getID() restituisce un valore Long, è probabile che il confronto con '==' non riesca, perché verifica se si dispone dello stesso oggetto, non se gli oggetti hanno lo stesso valore.