Der Titel ist ziemlich selbsterklärend. Ich ziehe von C # nach Java um. Ich habe ein Objekt und eine Getter-Methode, die ihre ID zurückgibt. Ich möchte die IDs zweier Objekte desselben Typs vergleichen und prüfen, ob die Werte ihrer IDs gleich sind.
versucht:
%Vor% %Vor% %Vor%In Java:
==
sagt Ihnen, ob die beiden Operanden das gleiche Objekt (Instanz) sind. .equals()
für Long
sagt Ihnen, ob sie gleich im Wert sind. Aber Sie sollten auch nicht tun. Der richtige Weg, dies zu tun, ist dies:
%Vor% Mit assertEquals()
, wenn die Assertion fehlschlägt, wird die Fehlermeldung Ihnen sagen, was die beiden Werte waren, zB expected 2, but was 5
etc
Sie dürfen nicht gleich sein mit ==. Verwenden Sie entweder:
%Vor%oder
%Vor%In beiden Fällen habe ich Null-Checks weggelassen, weil ich bezweifle, dass Sie sie vergessen würden, wenn sie hier gebraucht würden;)
Also, warum ist Long nicht immer == ein anderer Long mit dem gleichen Wert? Die Antwort ist einfach. Sie sind verschiedene Objekte! Je nachdem, wie wie das Long abgerufen wurde, können sie aufgrund interner Zwischenspeicherung identisch sein. Siehe Long.valueOf .
Zusätzlich zu allen Kommentaren zum richtigen Vergleich kann eine starke Typisierung Ihnen bei der Lösung Ihres Problems helfen.
Liefert getID () etwas vom Typ Long (das ist ein Klassentyp) oder vom Typ long (das ist ein primitiver Typ)? Das Problem ist, dass, wenn die Methode einen primitiven Wert zurückgibt, der Vergleich mit '==' und 'equals ()' funktionieren wird, da Java Grundelemente automatisch in Wrapperobjekte umwandelt, wenn Sie sie benötigen.
Aber andersherum, wenn getID () einen Long-Wert zurückgibt, wird der Vergleich mit '==' wahrscheinlich fehlschlagen, weil das prüft, ob Sie dasselbe Objekt haben, nicht wenn die Objekte den gleichen Wert haben.
in Java,
Verwenden Sie ==
, um Grundelemente und x.equals(y)
zu vergleichen, um Objekte zu vergleichen.
Ich bin mir nicht sicher, was deine Frage ist - es sieht so aus, als ob du beides versucht hast, und hat auch nicht funktioniert?
Beachten Sie, dass Sie Long
anstelle von long
verwenden, daher möchten Sie .equals()
( long
ist ein Grundelement, Long
ist ein Objekt)
Sie müssen den Unterschied zwischen Long
und long
kennen - long
ist der primitive Typ, Long
ist der Wrappertyp. (Ein bisschen wie ein Boxed-Wert in C #, aber stark typisiert.) Was ist der Rückgabetyp von getId()
?
Einfach:
%Vor%sollte in Ordnung sein, wenn Sie dies in einem Test machen. Andernfalls könnten Sie Folgendes verwenden:
%Vor%wenn sie definitiv nicht null sind oder verwenden Sie Guava :
%Vor% um Nichtigkeit zu behandeln. (Sie können Objects.equal
natürlich, aber du solltest auf jeden Fall Guava auf jeden Fall ergattern, also kannst du das auch nutzen. ..)
Es ist erwähnenswert, dass bestimmte Wrapper-Objekte wiederverwendet werden - zum Beispiel:
%Vor%y = 10000L; assertTrue (x == y); // Referenzvergleich
Tags und Links java long-integer compare