2016-04-10 37 views
0

Aşağıdaki kodu çevrimiçi gördüm. sınıf, Object sınıfının hashCode() ve eşittir yöntemini geçersiz kılar. Ben sadece equals() yönteminin return ifadesinin alternatif & & ve || kullanmak zorunda olduğunu merak ediyordum? Sadece & & kullanabilir miyim? Alternatif & & ve || kullanmak zorunda özel bir neden var mı?geçersiz kılma eşitleme() yönteminin döndürme ifadesi neden alternatif && ve ||?

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

olarak çok zor bir durum olduğunu yeniden öneriyoruz. Daha okunabilir hale getirmek için ifadeler varsa bunu birden çok bölüme ayırmanızı öneririm. – Eran

+1

Bu zorunda değil. Bunu hiç böyle görmemiştim. Onu yazan kişi, eşit çağrılarda hedefleri ters çevirdi. Bence bu bir ihtiyat ve aşırı bir anlayış. Misafir boşsa, yöntem bu karışıklığa ulaşmadan önce false değerini döndürür. Öyleyse neden misafirin boş olabileceği konusunda endişeleniyorsunuz? Muhtemelen kötü yapılmış bir şey için bir düzeltme. – duffymo

+1

Bilgilerim ilerledikçe, bu yöntemde beklenmedik çıktılar veren mantıksal olarak yanlış kod vardır. Ama, @TonyStark, her zaman Jarvis'e sorabilirsin! – Hackerdarshi

cevap

2

Hem kopmalar || ilk işlenen ile ikame edilebilir olacaktır

(getter varsayarak alan değerini verir)
id == guest.id 
     && (firstName == null ? guest.firstName == null : firstName.equals(guest.firstName)) 
     && (lastName == null ? guest.lastName == null : lastName.equals(guest.lastName)); 

Ama bu `equals` yöntem şimdi olduğu gibi anlamak

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

OR koşulu onlar null değilse sırasıyla dikkate alınması ad veya soyadının değerinin bağlı kullanılır. Ama bu durum üçlünün ikinci bölümünde kontrol ediliyor mu? : Operatör, böylece OR parçasını kaldırabilirsiniz. ikinci bir operatör sadece tekrar tenary operatörün ikinci bir alternatif kapsadığı sonuç, aynı

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