2016-04-10 12 views
0

私は以下のコードをオンラインで見ました。クラスはObjectクラスのhashCode()メソッドおよびequalsメソッドをオーバーライドします。私は、なぜequals()メソッドのreturn文が代わりの& &と||を使用しなければならないのか不思議に思っていましたか?私はちょうど& &を使用することができますか?代替のものを使用しなければならない特別な理由はありますか?& &と||なぜオーバーライドequals()メソッドのreturn文は、代わりの&&と||を使用する必要がありますか?

class Person { 

private int id; 
private String firstName; 
private String lastName; 

@Override 
public boolean equals(Object obj) { 
    if (obj == this) { 
     return true; 
    } 
    if (obj == null || obj.getClass() != this.getClass()) { 
     return false; 
    } 

    Person guest = (Person) obj; 
    return id == guest.id 
      && ((firstName == null ? guest.firstName == null : firstName.equals(guest.firstName)) 
      || (firstName != null && firstName.equals(guest.getFirstName()))) 
      && ((lastName == null ? guest.lastName == null : lastName.equals(guest.lastName)) 
      || (lastName != null && lastName.equals(guest.getLastName()))); 
} 

@Override 
public int hashCode() { 
    final int prime = 31; 
    int result = 1; 
    result = prime * result 
      + ((firstName == null) ? 0 : firstName.hashCode()); 
    result = prime * result + id; 
    result = prime * result 
      + ((lastName == null) ? 0 : lastName.hashCode()); 
    return result; 
} 



} 
+2

としてそれを書き換えるお勧めします。私はそれを複数のif文に分割して読みやすくすることをお勧めします。 – Eran

+1

これは必要ありません。私はこれをこのようにして見たことがありません。それを書いた人は、equalsコールでターゲットを裏返しました。私はそれが過剰な注意と理解の不足だと思う。 guestがnullの場合、このメソッドはfalseを返します。だから、ゲストがnullになる可能性についてどうして心配ですか?おそらく、それはひどくやり遂げられた何かのための修正です。 – duffymo

+1

私の知る限り、このメソッドは論理的に間違ったコードを持ち、予期しない出力を与えることがあります。しかし、ちょっと@トニースターク、あなたはいつもジャービスを頼むことができます! – Hackerdarshi

答えて

2

両方選言は||の最初のオペランドと置き換えることができるであろう

(ゲッターを仮定すると、フィールドの値を返します)
id == guest.id 
     && (firstName == null ? guest.firstName == null : firstName.equals(guest.firstName)) 
     && (lastName == null ? guest.lastName == null : lastName.equals(guest.lastName)); 

しかし、私はこの `equals`方法が今のように理解することは非常に困難である

id == guest.id 
     && Objects.equals(firstName, guest.firstName) 
     && Objects.equals(lastName, guest.lastName); 
1

OR条件は、それらがnull出ていない場合は、それぞれに考慮名または姓の値に応じて使用されます。しかし、その状態はすでに三元の第2部分でチェックされていますか? :演算子、OR部分を削除することができます。第二オペレータはもう一度tenaryオペレータの第二の代替をカバーするので、結果は、同じ

((firstName == null ? guest.firstName == null : firstName.equals(guest.firstName)) || (firstName != null && firstName.equals(guest.getFirstName())))