簡體   English   中英

為什么覆蓋equals()方法的return語句必須使用替代&&和||?

[英]why the return statement of override equals() method has to use alternate && and ||?

我在網上看到下面的代碼。 該類重寫Object類的hashCode()和equals方法。 我只是想知道為什么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;
}



}

這兩個析取符都可以替換為||的第一個操作數。 ,因為第二個運算符僅再次覆蓋了tenary運算符的第二個替代項(假設getter返回字段值)

 id == guest.id
        && (firstName == null ? guest.firstName == null : firstName.equals(guest.firstName))
        && (lastName == null ? guest.lastName == null : lastName.equals(guest.lastName));

但我建議將其重寫為

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

如果不是null值,則根據分別考慮的名字或姓氏的值使用或條件。 但是那個條件已經在三元組的第二部分中檢查了嗎? :運算符,因此您可以刪除“或”部分。 結果將是相同的

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM