2012-03-13 6 views
8

タイトルはかなり自明です。私はC#からJavaに移行しています。私はオブジェクトとそのIDを返すゲッターメソッドを持っています。私は、同じ型の2つのオブジェクトのIDを比較し、それらのIDの値が等しいかどうかをチェックしたいと思います。試してみましたJavaの2つの基本的な長い変数を比較してください

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

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

assertTrue(id1.equals(id2)) 

assertTrue(id1== id2) 
+0

実際、この質問は、比較のためではなく、同等性のテストについてのものであるため、混乱します。 http://docs.oracle.com/javase/7/docs/api/java/lang/Comparable.html#compareTo(T) –

答えて

21

:2つのオペランドが同じオブジェクト(インスタンス)である場合に

  • ==オペレータがわかります。
  • .equals()の方法がLongの場合、の値がであるかどうかがわかります。

しかし、どちらも行うべきではありません。それを行うための正しい方法はこれです:アサーションが失敗した場合、エラーメッセージが二つの値が何であったかを教えてくれる、assertEquals()

assertEquals(id1, id2); 

、例えばexpected 2, but was 5など

1

をあなたがLonglongの違いを認識する必要が - longLongがラッパ型で、プリミティブ型です。 (C#ではボックス化された値のようなビットですが、厳密に型指定されています)getId()の戻り値の型は何ですか?

単に:あなたはテストでこれをやっている場合

assertEqual(id1, id2); 

問題ないはずです。そうでなければ、使用できます。

if (id1.equals(ids2)) 

彼らは間違いなくないヌルだ、またはGuavaを使用する場合:

if (Objects.equal(id1, id2)) 

NULLかどうかを処理するために。 (もちろん、Objects.equalを自分で書くことができますが、あなたにもそれを使用する場合がありますので、あなたは間違いなく、グアバとにかくのホールドを取得する必要があります...)

それは特定のラッパーオブジェクトが再利用されていることは注目に値します - 例えばので、 :

// 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); //参考比較

2

は、次のやって試してみてください:Javaで

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

Javaでは、

プリミティブを比較するには==を使用し、オブジェクトを比較するにはx.equals(y)を使用してください。

私はあなたの質問が何であるか分かりません。あなたは両方を試してみたようですが、どちらもうまくいきませんでしたか?

注意、==

+0

ありがとうございました!私はブレークポイントを設定してチェックしても同じであったにもかかわらず、同じであったはずの2つのファイルの修正日を比較していました(一方はもう一方に設定されていました)。 "Long jFileTime = jFile.lastModified();"の大文字Lが小文字のlに置き換えられ、突然私の==比較が機能し始めたのは間違いです。実際には、暗黙的で非明示的なキャストがどのように発生しているかについてのコンパイラの警告は表示されません... – ArtOfWarfare

2

は、彼らが使用して同じであってはなりません(Longはオブジェクトである、long原始的である)あなたの代わりにlongLongを使用しているので、あなたは

.equals()を使用したいです。次のいずれかを使用します

id1.equals(id2) 

または私は彼らがここで必要とされた場合は、それらを忘れてしまったと思います疑うので、私は、ヌル・チェックアウト、左、両方のケースで

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

;

それでは、なぜ)常に同じではない長い==別の同じ値の長い?答えは簡単です。彼らは別のオブジェクトです! によると、内部キャッシュのために、Longが取得されたのは同じかもしれません。Long.valueOfを参照してください。

2

適切な比較に関するすべてのコメントに加えて、厳密なタイピングは、問題の解決に役立ちます。

getID()は、Long型(クラス型)またはlong型(プリミティブ型)のものを返しますか?問題は、メソッドがプリミティブ値を返す場合、 '=='と 'equals()'を比較すると、Javaが自動的にプリミティブを必要に応じてラッパーオブジェクトにキャストするためです。

しかし、getID()がLong値を返す場合、 '=='と比較すると失敗する可能性があります。これは、オブジェクトが同じ値を持つ場合ではなく、同じオブジェクトを持つかどうかをチェックするためです。

関連する問題