2015-12-28 1 views
14

Javaでタプルのような構造を可能にするタプルクラスを作成しようとしています。タプルの2つの要素の一般的な型はそれぞれXとYです。私はこのクラスの正しいequalsを上書きしようとします。Objects.equals and Object.equals

事は、私ははObject.equalsが、それはまだ「==」などの参照に基づいて比較し、私は、私はそれを使用することができますので、確認していないことをデフォルトに陥る知っている、です。私はオブジェクトを調べ、その中にequals()があります。これはまだ参考文献で比較していますか、それとも内容を比較していますか?

return Objects.equals(compared.prev, this.prev) && Objects.equals(compared.next, this.next); 

PREVおよびNEXTはタプルの要素である:

すばやくようなものとしてreturn文を想像しました。これは効果がありますか?

+2

組み込みのJREクラスのソースコードを読むことができます。 – chrylis

答えて

27

差がObjects.equals()は、2つのヌルが「等しい」と見なしています。擬似コードは次のとおり

  1. 正確に1つのパラメータがnullリターンfalse
  2. はそれを第二パラメータ
  3. を渡す最初のパラメータの equals()メソッドを呼び出した結果を返している場合、両方のパラメータが nullリターン true
  4. ある場合

この動作は、それが「ヌル安全」であることを意味します。

+0

ポイント2の記述が間違っています。コードは 'return(a == b)|| (a!= null && a.equals(b)); '実際には**最初の**パラメータが' null'の場合 'false' *を返します。 2番目が 'null'の場合、' null'パラメータで 'equals'が呼び出されます。あなたが 'equals'を間違って実装したのであれば、これは興味深いかもしれません。 –

0

Objects.equalsはちょうどそれが最初の引数.equals方法です呼び出します。 Javaでは、作成したクラスのインスタンスで同等かどうかをテストできるようにするには、equalsメソッドをオーバーライドする必要があります。インスタンスの型がequalsメソッドをオーバーライドしない場合、instance.equals()は==のみを使用します。

+1

'hashCode'をオーバーライドすることも忘れないでください。 – Robert

+2

いいえ、それはしません。 – Bohemian